您好,登錄后才能下訂單哦!
快速排序的思想是分而治之,利用遞歸達到快速排序的效果
首先要選定一個基準數,一般選擇最左邊的數為基準數,排序的目標就是讓這個基準數的左邊全小于這個基準數,右邊全大于這個基準數。然后以這個基準數為分隔線,在左右兩側再次調用這個排序的函數,直到全部有序。簡述過程:
以 8 9 4 7 2 6 首選
1. 選擇兩個哨兵 i,j 分別指向8,6,基準數為8
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指向7
6 9 4 7 2 9
重復以上步驟,直到 哨兵i 和 哨兵j相遇
4.最后一步將基準值放到中間
代碼實現:
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
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。