MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法三)
本算法核心代码翻译自《算法导论》(第三版)第7章:快速排序。这段代码也要求所排序列是“左闭右闭”区间,跟清华大学邓俊辉老师在《数据结构》MOOC课程中所讲的业界一般默认的“左闭右开”区间的序列不一样。“左闭右开”区间的快速排序在算法一和算法二中有,但是算法一和算法二我不开源哦!需要的可以联系我的QQ购买:3121432464,备注要说明原因。算法一和算法二的参考价格:1000元/个,先付款、后给代码,非诚勿扰。
#include <iostream>
using namespace std;
#define N 20
int recursion_time = 0;
//定义显示递归次数的全局变量
int main()
{
int a[N] = {30,38,3,32,15, 1,41,47,59,80, 6,93,78,18,65, 60,51,22,31,17};
//测试数据前18个元素都不变,最后的元素分为四种情况测试:
//整体个数为奇数个(19)且最末元素比最首元素大(31)
//整体个数为奇数个(19)且最末元素比最首元素小(17)
//整体个数为偶数个(20)且最末元素比最首元素大(17,31)
//整体个数为偶数个(20)且最末元素比最首元素小(31,17)
void QuickSort(int *array, int start, int end);
void OutputOfArray(int *array, int n);
cout << "原数组为:" << endl;
OutputOfArray(a, N);
QuickSort(a, 0, N - 1);
cout << "排序后的数组为:" << endl;
OutputOfArray(a, N);
return 0;
}
//以下两个函数的代码翻译自《算法导论》第三版中的快速排序算法
void QuickSort(int *A, int p, int r)
{
int Partition(int *A, int p, int r);
int q = 0;
if(p < r)
{
q = Partition(A, p, r);
//以下12行是测试代码
recursion_time++;
cout << "第" << recursion_time <<"轮递归的结果为:" << endl;
for(int i = p; i <= q - 1; i++)
{
cout << "a[" << i << "]=" << A[i] << "; ";
}
cout << "pivot=" << "a[" << q << "]=" << A[q] << "; ";
for(int i = q + 1; i <= r; i++)
{
cout << "a[" << i << "]=" << A[i] << "; ";
}
cout << endl << endl;
//输出本轮递归的结果,注意排版格式
QuickSort(A, p, q - 1);
QuickSort(A, q + 1, r);
}
}
int Partition(int *A, int p, int r)
{
int x = A[r];
int i = p - 1;
int temp = 0;
for(int j = p; j <= r - 1; j++)
{
if(A[j] <= x)
{
i = i + 1;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
temp = A[i + 1];
A[i + 1] = A[r];
A[r] = temp;
return i + 1;
}
void OutputOfArray(int *array, int n)
{
for(int i = 0; i < n; i++)
cout << array[i] << '\t';
cout << endl;
} 注意第22行最后一个参数要在宏N的基础上减1,否则会发生数组下标越界的错误。
测试结果:
软件业务请联系QQ:3121432464“正聪科技客服”
posted on 2017-10-05 18:17 sunshineman1986 阅读(127) 评论(0) 收藏 举报
浙公网安备 33010602011771号