MOOC清华《程序设计基础》第5章:快速排序(不分配动态空间-算法三)

来源:互联网 发布:统赢编程说明书 编辑:程序博客网 时间:2024/05/29 20:00

本算法核心代码翻译自《算法导论》(第三版)第7章:快速排序。这段代码也要求所排序列是“左闭右闭”区间,跟清华大学邓俊辉老师在《数据结构》MOOC课程中所讲的业界一般默认的“左闭右开”区间的序列不一样。“左闭右开”区间的快速排序在算法一和算法二中有,但是算法一和算法二我不开源哦!需要的可以联系我的QQ购买:3121432464,备注要说明原因。算法一和算法二的参考价格:1000元/个,先付款、后给代码,非诚勿扰。

#include <iostream>using namespace std;#define N 20int 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,否则会发生数组下标越界的错误。

测试结果:




阅读全文
0 0
原创粉丝点击