参考资料
很多程序语言标准库实现排序的内置算法就是快速排序,这里使用C++自己实现。
#include<iostream>
using namespace std;
//left和right主要是为了标记排序起止位置,方便递归调用,左闭右开区间
void quikSort(int a[], int n, int left, int right)
{
if (left < right)/*递归出口,即当起止位置相同时(即元素个数为0时)就不需要递归了;实际上元素个数为1时就不需要递归了,因此也可以是设置条件为left+1<right,结果一致*/
{
int mid = a[left];//第1个元素作为对比基准
int l = left + 1;//所以从第2个元素开始对比
int r = right - 1;//右开区间,所以实际上右边第1个元素下标要减去1
while (true)
{
while (l <= r && a[l] < mid)//从左边遍历,直至找到一个大于基准的元素为止
l++;
while (l <= r && a[r] >= mid)//从右边遍历,直至找到一个小于基准的元素为止
r--;
if (l > r)//如果左边指针大于右边指针,说明已经遍历完毕,结束循环
break;
else//否则置换左右指针元素,使大的到右侧,小的到左侧
{
int temp1;
temp1 = a[l];
a[l] = a[r];
a[r] = temp1;
}
}
a[left] = a[r];//置换基准元素与右指针指向的元素,基准处于中间位置
a[r] = mid;
quikSort(a, n, left, r);//递归快速排序基准左侧元素
quikSort(a, n, r + 1, right);//递归快速排序基准右侧元素
}
}
int main()
{
const int n = 11;
int a[n] = { 3,-5,-6,5,6,-76.-453,-768,-7,90,34 };
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
quikSort(a, n, 0, n);
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
运行结果: