基本思想
以某个记录的关键字为比较的基准(划分元),将整个序列划分为两组,左边记录的关键字小于等于划分元,右边的关键字大于等于划分元,而划分元所属记录的位置就是最终有序序列中的位置。对左右部分数据,再各自选取一个记录的关键字作为划分元,将两个子序列划分成更小的子序列,这样一直进行下去,最终将整个序列排列成有序序列。对划分元的选择,最简单的办法就是选取当前序列的第一个关键字为划分元。
具体过程
设置2个指针 i 和 j指向序列的2端,
1. 将指针i处的记录保存到临时存储单元。
2. 从右端j处开始向左查找,直到某个记录的值比划分元小,交换i、j指向的值。i++
3. 从左端i处开始向右查找,直到某个记录的值比划分元大,交换i、j指向的值。j--
4. 循环2和3,直到 i>=j。
5. 对左、右子序列应用1-4步骤
1-4即是一次交换过程,划分之后可以对左右子序列重复1-4过程直到完成排序。
代码实现:
void showdata(int* a, int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void quicksort(int *a,int i, int j)
{
cout << i << " " << j << endl;
if (i >= j)
{
return;
}
int left = i;
int right = j;
int tmp = a[i];
while (i < j)
{
while (a[j] > tmp && i<j)
{
j--;
}
if (i < j)
{
a[i] = a[j];
i++;
}
while (a[i] < tmp && i<j)
{
i++;
}
if (i < j)
{
a[j] = a[i];
j--;
}
}
a[i] = tmp;
cout << "lr: i="<<i <<" "<<left << " " << right << endl;
showdata(a, 11);
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
}
int main()
{
int a[] = { 56,23,67,26,85,14,17,68,73,45,77 };
quicksort(a, 0, 10);
}
运行截图: