数据结构值排序算法(三)-快速排序
快速排序采用的思想是分治思想。
第一趟排序:快速排序是找出一個元素(理論上可以隨便找一個)作為基準(pivot),然后對數組進行分區操作,使基準左邊元素的值都不大于基準值,基準右邊的元素值 都不小于基準值,如此作為基準的元素調整到排序后的正確位置。
遞歸排序:第二步就是對高段位和地段為兩部分進行遞歸排序。
一趟快速排序的算法的步驟是:
1)設置兩個變量low、high,排序開始的時候:low=0,high=N-1;
2)以第一個數組元素作為關鍵數據,賦值給key,即key=A[0];
3)從high開始向前搜索,即由后開始向前搜索(high--),找到第一個小于key的值A[high],將A[high]和A[low]互換;
4)從i開始向后搜索,即由前開始向后搜索(low++),找到第一個大于key的A[low],將A[low]和A[high]互換;
5)重復第3、4步,直到low=high;
一趟快速排序的算法的圖解是:
QuickSortClass.java
public class QuickSortClass {private int[] array;public int[] getArray() {return array;}public void setArray(int[] array) {this.array = array;}//快速排序 public void quikSort(){ QuikSort(0,array.length-1); } //遞歸的快速排序 private void QuikSort(int low,int high){ if(low>=high){ return; }else{ int pivot = array[low]; //以第一個元素為基準 int partition =partition(low,high,pivot); //對數組進行劃分,比pivot小的元素在低位段,比pivot大的元素在高位段 QuikSort(low,partition-1); //對劃分后的低位段進行快速排序 QuikSort(partition+1,high); //對劃分后的高位段進行快速排序 } } //以pivot為基準對下標low到high的數組進行劃分 ,low 數組段的最小下標 ,high 數組段的最大下標 , pivot 劃分的基準元素 , 劃分完成后基準元素所在位置的下標 private int partition(int low,int high,int pivot){ while(low<high){ while(low<high &&array[high]>=pivot){ //從右端開始掃描,定位到第一個比pivot小的元素 high--; //如果array[high]比基準pivot大,就不管,繼續向前移動} swap(low,high); //如果array[high]比基準pivot小,就交換low和highwhile(low<high &&array[low]<=pivot){ //從左端開始掃描,定位到第一個比pivot大的元素 low++; //如果array[low]比基準pivot小,就不管,繼續向后移動} swap(low,high); //如果array[low]比基準pivot大,就交換low和high } return low; } //交換數組中兩個元素的數據 private void swap(int low,int high){ int temp = array[high]; array[high] = array[low]; array[low] = temp; } }
public class TestQuickSort {public static void main(String[] args) {// TODO Auto-generated method stubint[] list={25,24,6,65,11,43,22,51};QuickSortClass qs=new QuickSortClass();System.out.println("快排前的數組是:");for(int i=0;i<list.length;i++){System.out.print(list[i]+" ");}qs.setArray(list);qs.quikSort();int[] list2= qs.getArray();System.out.println();System.out.println("快排后的數組是:");for(int i=0;i<list2.length;i++){System.out.print(list2[i]+" ");}} }
算法分析:
在最差的情況下,劃分有n個元素構成的數組需要進行n次比較和n次移動,因此劃分所需的時間為O(n).在最差的情況下,每次主元會將數組劃分成為一個大數組和一個空數組。這個大數組的規模是在上次劃分的基礎上減一。該算法需要(n-1)+(n-2)+...+2+1=O(n2).
在最佳的情況下,每次主元會將數組劃分成為規模大致相等的部分。設T(n)標識使用快速排序算法堆包含n個元素的數組排序所需要的時間,因此
? ? ? ? ? ? ? ? ? ? ? ? T(n)=T(n/2)+T(n/2)+n
快速排序的T(n)=O(nlogn)
總結
以上是生活随笔為你收集整理的数据结构值排序算法(三)-快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构之排序算法(一)-堆排序
- 下一篇: 数据结构之排序算法(四)-归并排序