一趟快排(用pivotkey将数字分为两组,左边是小于pivotkey的,右边是大于pivotkey的):
1.输入一个长度为n数组,首地址a[0]记为a[low], 尾地址a[n - 1]记为a[high];
2.将数组第一个数字设为pivotkey,后进的数与之比较的数
3.让a[high]与pivotkey进行比较,若是大于pivotkey,high--,直至a[high]<pivotkey;
a[low]与pivotkey进行比较,若是小于pivotkey,low++,直至a[low]>pivotkey;
4.比较结束时,low == high;
5.把pivotkey值赋给a[low];
int Partition(int a[],int low,int high)
{
int pivotkey;
pivotkey = a[low];
while(low < high)
{
while(low < high && a[high] >= pivotkey)
high--;
a[low] = a[high];
while(low < high && a[low] <= pivotkey)
low++;
a[high] = a[low];
}
a[low] = pivotkey;
return low; //pivotkey将原数组分成了两部分,就像二分法一样,返回pivotkey的位置下标,将数组分成(low,key - 1)与(key+1,high)两部分
}
实现多趟快排(递归实现):
void Qsort(int a[],int low,int high)
{
int key;
if(low < high) //像二分法一样,逐渐缩小数组的大小直至数组只剩一个数字
{
key = Partition(a,low,high);
Qsort(a,low,key - 1);
Qsort(a,key + 1,high);
}
}