一直使用c++ STL的sort,没有自己亲自写过,上代码。
#include <stdio.h>
int Partition(int arry[], int low, int high)
{
//no need to bound condition
int key = arry[low];
while(low < high)
{
while(low<high && arry[high]>=key) --high;
arry[low] = arry[high];
while(low<high && arry[low]<=key) ++low;
arry[high] = arry[low];
}
arry[low] = key;
return low;
}
//分治
void QSort(int arry[], int low, int high)
{
if(low >= high)
return;
int ipos = Partition(arry,low,high);
QSort(arry,low,ipos-1);
QSort(arry,ipos+1,high);
}
int main()
{
const int iarrynum = 10;
int arry[10] = {10,9,8,7,6,5,4,3,2,1};
QSort(arry,0,iarrynum-1);
int i;
for(i=0; i<iarrynum; ++i)
{
printf("%d\t",arry[i]);
}
printf("\nDone\n");
}
其中patition有多个变种,其中之一可以是
partition(A,left,right)
{
p=select pivot in A[left,right];
swap A[p] and A[right];
store = left;
for i=left to right-1 do
if A[i] <= A[right] then
swap A[i] and A[store]
store++
swap A[store] and A[right]
return store
}
而且select pivot可以有多个变种,由外部提供。