快速排序的簡單實現(Quick Sort)

2022-09-13 20:36:11 字數 1813 閱讀 5701

快速排序由c. a. r. hoare在2023年提出。它的基本思想是:速排序和歸併排序類似,也是運用了遞迴的思想,通過一趟排序將要排序的資料分割成獨立的兩部分,每次選取乙個主元(pivot),使得主元左邊的的元素都比主元小,主元右邊的元素都大於主元,然後分別對主元兩邊再遞迴的呼叫quicksort。

步驟
step1:選取主元,然後通過左右兩邊元素的交換使得使得主元左邊的的元素都比主元小,主元右邊的元素都大於主元。

step2:遞迴的再主元左右兩邊執行step1,直到區間長度為1.

選取主元

// 主流的選擇主元方法 //取 最左邊 最右邊 最中間 三個數的 中位數

int media3(elemtype *a,int left,int right)

主流的選取主元的方法為:選取 當前區間最左邊 最右邊 以及最終間三個數的中位數。

我們通過swap使得  左中右有序,然後將中間的元素與 right-1位置元素互換位置,這樣需要變動位置的僅僅是left+1 到right-2了;

劃分集合

使得左邊元素都小於主元, 右邊元素都大於主元

int i = left, j =right - 1; 

for(;;) //找到左邊比pivot大的數停止

while(a[--j] > pivot){}//找到右邊比pivot小的數停止

if( i < j)

swap(a[i],a[j]);

else break; //如果 i在 j的右邊,說明集合劃分完畢

}swap(a[i],a[right-1]); /最後將主元放到應在的位置

當然,因為使用了遞迴,所以在小規模資料的情況下,快速排序的效率可能還不如簡單排序,因此我們需要判斷下當前的規模。通過設定cutoff變數,如果當前遞迴執行的區間長度大於這個值我們繼續quicksort,否則執行insertionsort。

源**

void insertion_sort(elemtype *a,int n)

}int cutoff = 10;

// 主流的選擇主元方法 //取 最左邊 最右邊 最中間 三個數的 中位數

int media3(elemtype *a,int left,int right)

void quicksort(elemtype *a,int left,int right) //找到左邊比pivot大的數停止

while(a[--j] > pivot){}//找到右邊比pivot小的數停止

if( i < j)

swap(a[i],a[j]);

else break; //如果 i在 j的右邊,說明集合劃分完畢

} swap(a[i],a[right-1]); //將 原來藏在right -1 位置的主元交換到應該的位置,此時的位置是確定的

quicksort(a,left,i-1); //遞迴的處理左邊

quicksort(a,i+1,right); //遞迴的處理右邊

} else //因為quicksort處理小規模資料較慢(遞迴),因為在小於cutoff時呼叫insertionsort

insertion_sort(a+left,right-left+1);

}void quick_sort(elemtype *a,int n)

快速排序的簡單實現

快速排序是一種比較高階的排序方法。擁有o nlogn 的平均複雜度。快速排序的基本思路是交換。具體做法如下,首先選定序列中的乙個元素作為樞軸量 通常選擇第乙個元素 然後讓序列中的各元素依次和樞軸量進行比較,通過交換使得 比它小的排在它左邊,比它大的排在它右邊。通過這一趟排序,我們將序列分成了兩部分,...

快速排序java簡單實現

快速排序簡單實現 將陣列的某一段元素進行劃分,小的在左邊,大的在右邊 param a 陣列 param start 開始的位置 param end 結束的位置 return 基準值的位置 public static intdivide int a,int start,int end 上面的while...

2015 6 9 快速排序的java簡單實現

快速排序的思想不知道怎麼描述,那麼就直接貼 吧。做個筆記。public class quicksort sort a,0,a.length 1 for int i 0 i right return if left 0 right a.length 1 return int i left int j ...