#include <iostream>
using namespace std;
#define N 10
int a[N] = {3,6,9,1,2,5,7,4,0,8};
void quick(int left, int right)
{
int sign = a[left];
int i = left;
int j = right;
if(left > right)
return ;
while (i != j)
{
while (i < j && sign <= a[j])//從右往開始找到此時數組中比第一個數小的位置的座標j
j--;
while (i < j && sign >= a[i])//從左往開始找到此時數組中比第一個數大的位置的座標i
i++;
if (i < j)//將i和j對應數組的數值交換
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
//以上while循環結束後,得到他們的交遇點i
int tmp1 = a[i];//將此時數組的第一個數和交遇點i對應數組的數值交換
a[i] = a[left];
a[left] = tmp1;
quick(left,i-1); //將此時數交遇點i-1之前數組進行排序
quick(i+1,right);//將此時數交遇點i+1之後數組進行排序
}
int main()
{
for (int i =0; i < N; i++)
cout<<a[i]<< " ";
cout<<endl;
quick(0, N-1);
for (i =0; i < N; i++)
cout<<a[i]<< " ";
cout<<endl;
return 0;
}
快速排序的解題思路
先從數組右邊開始往左找到比第一個數小的做標記①
然後從數組左邊開始往右找到比第一個數大的做標記②
之後交換這倆個數
繼續從標誌①往左搜索,再從標誌②往右搜索,
如果標誌①和標誌②未相遇,繼續重複以上步驟
直到標誌①和標誌②到達同樣位置
首地址和標誌③交換
以標誌③爲中心,分開成兩個部分,分別處理,也就說兩個數組分別重複以上步驟