快速排序的總結

快速排序的思想是分而治之,利用遞歸達到快速排序的效果
ide

首先要選定一個基準數,通常選擇最左邊的數爲基準數,排序的目標就是讓這個基準數的左邊全小於這個基準數,右邊全大於這個基準數。而後以這個基準數爲分隔線,在左右兩側再次調用這個排序的函數,直到所有有序。簡述過程:函數

以  8 9 4 7 2 6 首選ui

1. 選擇兩個哨兵 i,j 分別指向8,6,基準數爲8spa

2.從j哨兵開始,由於j指向的6小於基準數8,不符合j指向的數都要大於8的要求,因此將j指向的數覆蓋i指向的數,同時i指向的數變成9排序

6 9 4 7 2 6遞歸

3.此時i指向9大於基準數8,不符合基準數左邊的都要小於基準數,右邊的都要大於基準數,因此i指向的數覆蓋j指向的數,同時j--,j指向7it

6 9 4 7 2 9class

重複以上步驟,直到 哨兵i 和 哨兵j相遇循環

4.最後一步將基準值放到中間 tab

代碼實現:

void QuickSort(int a[], int low, int high)

{

int i = low, j = high;//每次i,j都指向最低一個元素,和最高一個元素

int temp = a[low];//每次選擇最左邊的數爲基準數

while(i < j)//每次循環結束的條件是 i == j

{

while(i < j && a[j] >= temp) j--;//先從左邊開始,找到小於基準數的數

if(i < j){

a[i] = a[j];

i++;

}//和i指向的數交換

while(i < j && a[i] <= temp) i++;//找到基準數左邊大於基準數的數

if(i < j){

a[j] = a[i];

j--;

}//換到基準數右邊去

}//以上執行完後,將基準數放到中間

a[i] = temp;

if(low < i)//若是是基準數左邊的話

     QuickSort(a, low, i-1);//將最高位i-1

if(i < high)//若是是基準數右邊的話

QuickSort(a, j+1, high);//最低位爲基準位+1

}

相關文章
相關標籤/搜索