1、河北经贸大学课程:面向对象程序设计题目:排序问题学 院:信息技术学院 专 业:计算机应用技术 学 号: 201150010273学生姓名: 成晓宁指导教师: 吕瑞华 摘要 :随着科技的不断发展,计算机的应用领域越来越广,但由于计算机硬件的速度和存储空间的有限性,如何提高计算机速度并节省存储空间一直成为软件编制人员努力的方向,在众多措施中,排序操作成为程序设计人员考虑的因素之一,排序算法选择得当与否直接影响程序执行的速度和辅助存储空间的占有量,进而影响整个软件的性能。关键词:排序算法一、课程背景 一个排序算法是稳定的,就是当有两个有相等关键的纪录 R 和 S,且在原本的列表中 R 出现在 S 之
2、前,在排序过的列表中 R 也将会是在 S 之前。 当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。 (4,1) (3,1) (3,7) (5,6)在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有:(3,1 ) (3,7 ) ( 4,1) (5,6) (维持次序( 3,7) (3,1) (4,1 ) (5,6) (次序被改变)不稳定排序 算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,
3、如此在其他方面相同键值的两个对象间之比较,就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。在计算机科学所使用的排序算法通常被分类为: a)计算的复杂度(最差、平均、和最好性能) ,依据列表(list)的大小(n) 。一般而言,好的性能是 O(n log n),坏的性能是 O(n 平方)。对于一个排序理想的性能是 O(n)。仅使用一个抽象关键比较运算的 排序算法总 平均上总是至少需要 O(n log n)。b)存储器使用量(空间复杂度) (以及其他电脑资源的使用) c)稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。
4、d)一般的方法:插入、交换、选择、合并等等。交换排序包含冒泡排序和快速排序。插入排序包含希尔排序,选择排序包括堆排序等。排序的算法有很多,对空间的要求及其时间效率也不尽相同。下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。基数排序是针对关键字在一个较小范围内的排序算法。这次程序的算法包括插入排序 、冒泡排序 、选择排序 、快速排序 、堆排序、归并排序、基数排序、希尔排序。二、程序代码#includeusing namespace std;cons
5、t int maxsize=100;int num=0;/定义全局变量,为每一趟的输出做准备int x=0;templateclass sortlistprivate:int currentsize;/数据表中数据元素的个数public:type *arr;/存储数据元素的向量(排序表)sortlist():currentsize(0)arr=new typemaxsize;/构造函数sortlist(int n)arr=new typemaxsize;currentsize=n;void insert(int i,type x)arri=x;sortlist()delete arr;/析构函
6、数void swap(type x=y;y=temp;void bubblesort();/冒泡排序void quicksort(int low,int high);/快速排序void insertionsort();/直接插入排序void binaryinsertsort();/折半插入排序void selectsort();/简单选择排序void heapsort();/堆排序void mergesort(sortlist /归并排序void filterdown(const int start);/建立最大堆void mergepass(sortlist/一趟归并void merge(s
7、ortlist/两路归并算法;template /直接插入排序void sortlist:insertionsort()type temp;int j;for(int i=1;i=0int left,right;for(int i=1;i=left;k-)/向后移动arrk+1=arrk;arrleft=temp;cout/冒泡排序void sortlist: bubblesort()int i=1;int finish=0;/0 表示还没有排好序while(iarrj+1)/逆序swap(arrj,arrj+1);/相邻元素交换位置finish=0;/排序结束标志置为,表示本趟发生了交换,说
8、明还没有排好序i+;coutvoid sortlist:selectsort()/简单选择排序int k;for(int i=0;i/快速排序void sortlist:quicksort(int low,int high)/在待排序区间 low,high上,递归地进行快速排序int i=low,j=high;type temp=arrlow;/取区间第一个位置为基准位置if(i=arri)i+;if(i/建立最大堆void sortlist:filterdown(const int start)/向下调整使从 start 开始到 currentsize-1 为止的子表成为最大堆int i=s
9、tart,j=2*i+1;/j 为 i 的左孩子int tablesize=currentsize;type temp=arri;while(j=arrj)break;elsearri=arrj;i=j;j=2*j+1;arri=temp;template void sortlist:heapsort()int tablesize=currentsize;for(int i=(currentsize-2)/2;i=0;i-)filterdown(i); /初始建堆for(int j=currentsize-1;j=1;j-)swap(arr0,arrj);/堆顶元素和最后一个元素交换curre
10、ntsize-;filterdown(0);/重建最大堆coutvoid sortlist:merge(sortlist/指针初始化/i 是前一段的当前元素位置,j 是后一段的当前元素位置, k 是辅助数组的当前位置while(ivoid sortlist:mergepass(sortlistwhile(i+2*lenvoid sortlist:mergesort(sortlist int len=1;while(lench;if(ch=0) cout=0couttable(n);for(int i=0;inumber;table.insert(i,number);switch(ch) cas
11、e 1:cout“n *您选择的是直接插入排序*n“endl;table.insertionsort();break;system(“pause“);break;case 2:cout“n *您选择的是折半插入排序*n“endl;table.binaryinsertsort();break;system(“pause“);break;case 3:cout“n *您选择的是冒泡排序*n“endl;table.bubblesort();break;system(“pause“);break;case 4:cout“n *您选择的是简单选择排序*n“endl;table.selectsort();
12、break;system(“pause“);break;case 5:cout“n *您选择的是快速排序*n“endl;table.quicksort(0,n-1);break;system(“pause“);break;case 6:cout“n *您选择的是堆排序*n“endl;table.heapsort();break;system(“pause“);break;case 7:cout“n *您选择的是归并排序*n“endl;table.mergesort(table);break;system(“pause“);break; system(“pause“);return 0;三、结果及分析参考文献1王晓东 C+程序设计简明教程 中国水利水电出版社 2008