快速排序基本思想
以 6 1 2 7 9 3 4 5 10 8 按從小到大排序 為例進行說明:
- 以6為基準,小于6的放在6的左邊,大于6的放在6的右邊。
- 設置兩個標志器i=0, j=9; i在數組的最左邊,j在數組的最右邊。
- j先動,依次比較a[j]<6,如果不成立,j--; 如果成立則j停止。如果j<i,停止。
- i再動,依次比較a[i]>6, 如果不成立,i++;如果成立i停止。如果j<i,停止。
- 如果i=j,就將6與a[j]進行交換。
如此進行一輪:等到的結果是
3 1 2 5 4 6 9 7 10 8
6 左邊的都小于6,6右邊的都大于6。
然后再排序 3 1 2 5 4
然后再排序 9 7 10 8
代碼實現
#include <stdio.h>
int a[100];
int n;
void quicksort(int left, int right)
{
if (left >= right) {
return;
}
int i, j;
i=left;
j=right;
int temp = a[left]; //基準數據
while (i!=j) {
while (a[j]>=temp && j>i) {
j--;
}
while (a[i]<=temp && j>i) {
i++;
}
if (i<j) {
int k = a[i];
a[i] = a[j];
a[j] = k;
}
}
a[left] = a[i];
a[i] = temp;
quicksort(left, i-1);
quicksort(i+1, right);
return;
}
int main(int argc, const char * argv[]) {
// insert code here...
scanf("%d", &n);
for (int i=0; i<n; i++) {
scanf("%d", &a[i]);
}
quicksort(0, n-1);
for (int i=0; i<n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
總結
快速排序之所以比較快,因為相比冒泡排序,每次交換都是跳躍式的。每次排序都設置一個基準點,將小于等于基準點的數全部放在基準點的左邊,將大于等于基準點的數全部放在基準點的右邊。這樣在每次交換的時候就不會像冒泡排序一樣只能在相鄰的數之間進行交換。交換的距離也大得多了。