题目背景:要求编写函数qsort来实现快速排序,用户依次输入待排序数据个数、待排序数据以及排序方式。
注意:要求平均时间复杂度为O(n logn)
样例输入:
5
88 25 63 10 7
0
样例输出:
7 10 25 63 88
示例代码:
#include<iostream>
using namespace std;
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void cmpswap(int& a, int& b)
{
if (a < b)
{
swap(a, b);
}
}
void qsort(int a[], int s, int e, int f)
{
if (s >= e) return; //递归结束的基线条件
//三平均划分法使基准值随机,优化时间复杂度
int m = s + (e - s) / 2;
cmpswap(a[m], a[s]);
cmpswap(a[s], a[e]);
int pivot = a[s]; //选待排序数组第一个元素为基准值
//左右哨兵指针
int i = s + 1;
int j = e;
while (1)
{
if (f == 0) //从小到大排序
{
while (a[j] > pivot) j--; //基准值为第一个元素,必须右哨兵先移动
while (a[i] < pivot && i < e) i++;
}
else //从大到小排序
{
while (a[j] < pivot) j--;
while (a[i] > pivot && i < e) i++;
}
if (i < j)
{
swap(a[i], a[j]);
i++;
j--;
}
//基线条件,当左右哨兵碰头或越界时
else
{
swap(a[s], a[j]);
break;
}
}
//递归,对基准值左右两部分子数组递归地快排
qsort(a, s, j - 1, f);
qsort(a, j + 1, e, f);
}
int main()
{
cout << "The amount of numbers is:\n";
int n;
cin >> n;
int a[100];
cout << "Input numbers:\n";
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int flag = 0;
cout << "Choose the way of sorting: 0->small to large, 1->large to small :\n";
cin >> flag;
qsort(a, 0, n - 1, flag);
for (int i = 0; i < n; i++)
{
if (i < n - 1)
cout << a[i] << " ";
else
cout << a[i] << endl;
}
return 0;
}