快速排序思想如下:
將一串序列中某一項作爲基礎pivot,將小於pivot的元素移到pivot的左側,將大於pivot的元素移到右則,這樣就得到了以pivot的基準的兩串子序列,對子序列也做如此排序。
這裏也是用到了分治的策略,先分解再合併。
快速排序分解是難點。以位置low的元素爲基準,設置兩個遊標i=low,j=high。
先從右往左掃描,遇到小於pivot的元素,則p[i],p[j]交換.i++。此時停止向左掃描
再從左往右掃描, 遇到大雨pivot的元素,則p[i],p[j]交換.j++。此時停止向右掃描
判斷i是否小於j,爲真則繼續,直到i==j
代碼:
#include <iostream>
using namespace std;
int getPartition(int *p,int low,int high)
{
int pivot = p[low];
int i=low,j=high;
while(i<j)
{
while(p[j] > pivot) j--;
if(i<j)
{
swap(p[i],p[j]);
i++;
}
while(p[i] < pivot) i++;
if(i<j)
{
swap(p[i],p[j]);
j--;
}
}
return i;
}
void QuickSort(int *p,int low,int high)
{
if(low<high)
{
int mid = getPartition(p,low,high);
QuickSort(p,low,mid-1);
QuickSort(p,mid+1,high);
}
return ;
}
int main()
{
int n,i;
cin>>n;
int p[n];
for(i=0;i<n;i++)
cin>>p[i];
QuickSort(p,0,n-1);
for(i=0;i<n;i++)
cout<<p[i]<<" ";
return 0;
}