資料結構值排序演算法(三)-快速排序
基本思想:
快速排序採用的思想是分治思想。
第一趟排序:快速排序是找出一個元素(理論上可以隨便找一個)作為基準(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=pivot){ //從右端開始掃描,定位到第一個比pivot小的元素 high--; //如果array[high]比基準pivot大,就不管,繼續向前移動 } swap(low,high); //如果array[high]比基準pivot小,就交換low和high while(low
TestQuickSort.java
public class TestQuickSort {public static void main(String[] args) {// TODO Auto-generated method stub int[] 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)