数据结构课程设计排序算法总结
数据结构排序方法总结

数据结构排序方法总结数据结构排序方法总结⒈插入排序⑴直接插入排序⑵希尔排序⒉选择排序⑴简单选择排序⑵堆排序⒊交换排序⑴冒泡排序⑵快速排序⒋归并排序⒌基数排序⒍桶排序⒈插入排序插入排序是一种简单直观的排序方法。
它的基本思想是将数组分成已排序和未排序两部分。
我们从未排序部分中依次取出元素,然后插入到已排序部分的合适位置。
插入排序的时间复杂度为O(n^2)⑴直接插入排序直接插入排序的过程是将一个元素插入到已排序部分的合适位置,从而不断扩大有序序列的长度。
具体步骤如下:●从第一个元素开始,该元素可以认为已经被排序●取出下一个元素,在已经排序的元素序列中从后向前扫描●如果该元素(已排序)大于新元素,将该元素移到下一位置●重复步骤3,直到找到已排序的元素小于或等于新元素的位置●将新元素插入到该位置●重复步骤2-5,直到排序完成⑵希尔排序希尔排序是一种插入排序的改进版。
它通过将数组拆分为多个子序列来加快插入排序的速度。
具体步骤如下:●选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1●按增量序列个数k,对序列进行k趟排序●每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列●对每个子序列分别进行直接插入排序●重复步骤3-4,直到排序完成⒉选择排序选择排序的基本思想是每次从未排序的序列中选择最小(或最大)的元素,然后与未排序序列的第一个元素进行交换。
选择排序的时间复杂度为O(n^2)⑴简单选择排序简单选择排序的过程是找到未排序部分的最小元素,将它与未排序部分的第一个元素交换位置,从而逐步扩大有序序列的长度。
具体步骤如下:●在未排序序列中找到最小(大)元素,存放到排序序列的起始位置●从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾●重复步骤1-2,直到排序完成⑵堆排序堆排序使用堆数据结构来进行排序。
首先将待排序的序列构建成一个最大堆,然后依次取出堆顶元素,即最大元素,与末尾元素交换位置,再对剩余的元素重新调整成最大堆。
数据结构排序方法总结

数据结构排序方法总结
数据结构是计算机科学中非常重要的一个概念,它是计算机程序设计过程中的基础。
排序是数据结构中的一种基本操作,它指的是将一组数据按照一定的规则进行排列的过程。
在这篇文章中,我们将对数据结构中的排序方法进行总结。
1. 冒泡排序
冒泡排序是一种简单的排序算法,它的思想是通过相邻元素的比较和交换来排序。
它的时间复杂度是O(n^2)。
2. 选择排序
选择排序是一种简单的排序算法,它的思想是每次找到最小值,然后将其放置在已排序的序列末尾。
它的时间复杂度也是O(n^2)。
3. 插入排序
插入排序也是一种简单的排序算法,它的思想是将未排序的元素插入到已排序的序列中。
它的时间复杂度是O(n^2)。
4. 快速排序
快速排序是一种比较常用的排序算法,它的思想是通过分治的方式将原序列分成较小的子序列,然后递归地对子序列进行排序。
它的时间复杂度是O(nlogn)。
5. 归并排序
归并排序也是一种比较常用的排序算法,它的思想是将原序列分成较小的子序列,然后递归地对子序列进行排序,最后将已排序的子序列合并成一个有序的序列。
它的时间复杂度也是O(nlogn)。
总结:以上介绍了五种数据结构中常用的排序方法,它们各有优缺点,选择不同的排序方法取决于具体的应用场景。
在实际应用中,我们需要根据数据的规模和特性来选择最合适的排序方法,从而达到最优的排序效果。
数据结构排序方法总结

数据结构排序方法总结数据结构排序方法总结1.冒泡排序冒泡排序是一种基本的排序算法,它重复地交换相邻元素的位置,直到整个数组有序。
具体步骤如下:________●从第一个元素开始,依次比较相邻元素的大小,若前者大于后者,则交换它们的位置。
●重复上述比较和交换步骤,直到没有任何一对元素需要交换为止。
2.插入排序插入排序是一种简单直观的排序算法,它将一个未排序的元素逐个插入到已排序的序列中。
具体步骤如下:________●从第二个元素开始,将其与已排序的元素从右向左逐个比较,若大于待插入元素,则将已排序元素右移一位。
●将待插入元素插入到找到的位置处。
●重复上述比较和插入步骤,直到所有元素都已排序。
3.选择排序选择排序是一种简单直观的排序算法,它每次选择未排序序列中的最小元素,并将其与未排序序列的第一个元素交换位置。
具体步骤如下:________●在未排序序列中找到最小的元素,将其与未排序序列的第一个元素交换位置。
●在剩余的未排序序列中找到最小的元素,将其与未排序序列的第一个元素交换位置。
●重复上述比较和交换步骤,直到所有元素都已排序。
4.快速排序快速排序是一种高效的排序算法,它采用分治的思想,将一个数组分成两个子数组,然后递归地对子数组进行排序。
具体步骤如下:________●选择一个基准元素,将数组分成左右两个子数组,使得左子数组的所有元素小于等于基准元素,右子数组的所有元素大于等于基准元素。
●递归地对左子数组和右子数组进行排序。
●合并左子数组、基准元素和右子数组,得到排序后的数组。
5.归并排序归并排序是一种稳定的排序算法,它采用分治的思想,将一个数组分成两个子数组,然后递归地对子数组进行排序,并将排序后的子数组合并成一个有序数组。
具体步骤如下:________●分解:________将数组不断地对半分成两个子数组,直到子数组的长度为1。
●合并:________将两个已排序的子数组合并成一个有序的数组。
数据结构--排序算法总结

数据结构--排序算法总结概述排序的分类:内部排序和外部排序内部排序:数据记录在内存中进行排序外部排序:因排序的数据量大,需要内存和外存结合使用进行排序这里总结的八大排序是属于内部排序:当n比较大的时候,应采用时间复杂度为(nlog2n)的排序算法:快速排序、堆排序或归并排序。
其中,快速排序是目前基于比较的内部排序中被认为最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
———————————————————————————————————————————————————————————————————————插入排序——直接插入排序(Straight Insertion Sort)基本思想:将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。
即:先将序列的第1个记录看成一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,用于临时存储和判断数组边界直接插入排序示例:插入排序是稳定的,因为如果一个带插入的元素和已插入元素相等,那么待插入元素将放在相等元素的后边,所以,相等元素的前后顺序没有改变。
算法实现:[cpp]view plain copy1.#include<iostream>ing namespace std;3.4.void print(int a[], int n ,int i)5.{6. cout<<i<<":";7.for(int j= 0; j<8; j++){8. cout<<a[j] <<" ";9. }10. cout<<endl;11.}12.13.void InsertSort(int a[],int n)14.{15.int i,j,tmp;16.for(i=1;i<n;++i)17. {18.// 如果第i个元素大于第i-1个元素,直接插入19.// 否则20.// 小于的话,移动有序表后插入21.if(a[i]<a[i-1])22. {23. j=i-1;24. tmp=a[i]; // 复制哨兵,即存储待排序元素25. a[i]=a[i-1]; // 先后移一个元素26.while(tmp<a[j])27. {28.// 哨兵元素比插入点元素小,后移一个元素29. a[j+1]=a[j];30. --j;31. }32. a[j+1]=tmp; // 插入到正确的位置33. }34. print(a,n,i); // 打印每一趟排序的结果35. }36.}37.38.int main()39.{40.int a[8]={3,1,5,7,3,4,8,2};41. print(a,8,0); // 打印原始序列42. InsertSort(a,8);43.return 0;44.}分析:时间复杂度:O(n^2)———————————————————————————————————————————————————————————————————————插入排序——希尔排序(Shell Sort)基本思想:先将整个待排序的记录序列分割成为若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录依次进行直接插入排序。
数据结构排序算法总结

数据结构排序算法总结在计算机科学中,数据结构是组织和存储数据的方式。
排序算法是数据处理的基本操作之一,它们用于将一组元素按照特定的顺序进行排列。
在本文中,我们将总结几种常见的数据结构排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。
1. 冒泡排序冒泡排序是一种简单但低效的排序算法。
它通过比较相邻的元素并交换它们的位置来实现排序。
算法从列表的开头开始,并重复比较相邻元素,直到最大的元素“浮”到列表的末尾。
这个过程一遍又一遍地进行,直到整个列表排序完成。
冒泡排序的时间复杂度为O(n^2)。
2. 选择排序选择排序是一种简单直接的排序算法。
它的思想是(从小到大排序)在未排序的部分中找到最小(大)的元素,将其与未排序部分的第一个元素交换位置,然后将这个元素标记为已排序。
通过重复这个选择和交换的过程,列表会逐渐被分为已排序和未排序两个部分,直到整个列表排序完成。
选择排序的时间复杂度为O(n^2)。
3. 插入排序插入排序是一种简单但高效的排序算法。
它的思想是将未排序的元素逐个插入到已排序部分的正确位置。
首先,列表的第一个元素被视为已排序部分,然后逐个将未排序部分的元素插入到已排序部分的正确位置。
插入排序的时间复杂度为O(n^2),但在部分有序的列表上表现良好。
4. 快速排序快速排序是一种高效的排序算法,它采用了分治策略。
它选取一个基准元素,将列表分为两个子列表,其中一个子列表中的元素小于基准元素,另一个子列表中的元素大于基准元素。
然后,在子列表中递归地应用相同的过程,直到子列表的长度为1或0,即达到基本情况。
最后,将所有子列表合并起来得到排序的列表。
快速排序的时间复杂度为O(n log n),但在最坏的情况下可能退化到O(n^2)。
5. 归并排序归并排序是一种基于分治策略的排序算法。
它将列表分成两个子列表,递归地对子列表进行排序,然后将已排序的子列表合并成一个新的已排序列表。
归并排序的时间复杂度为O(n log n),它相对于快速排序的优势在于它是稳定的,并且适用于链表等非随机访问的数据结构。
数据结构排序总结

数据结构排序总结在计算机科学中,排序是一种常见的操作。
排序算法可以对一组数据元素进行按照特定顺序排列的操作。
在算法分析中,排序问题是一个重要且经典的研究方向。
本文将对几种常见的数据结构排序算法进行总结和归纳。
1. 冒泡排序(Bubble Sort)冒泡排序是一种简单且易于实现的排序算法。
它的基本思想是通过相邻元素的比较和交换,使得较大的元素逐渐向右移动。
该算法重复遍历整个数组,直到没有发生交换为止。
虽然冒泡排序的时间复杂度较高,但在数据量较小的情况下仍然可以使用。
2. 插入排序(Insertion Sort)插入排序是一种稳定且简单的排序算法。
它的基本思想是将数组分为已排序和未排序两部分,然后逐个将未排序元素插入到已排序部分的正确位置上。
插入排序的主要优点是对于小规模数组和基本有序的数组,它的效率较高。
3. 选择排序(Selection Sort)选择排序是一种简单但不稳定的排序算法。
它的基本思想是将数组划分为已排序和未排序两个部分,每次从未排序部分选择最小(或最大)的元素,然后与未排序部分的第一个元素交换位置。
选择排序的主要缺点是不管数组原始有序与否,其时间复杂度都相同。
4. 快速排序(Quick Sort)快速排序是一种高效且常用的排序算法。
它的基本思想是通过选择一个基准元素,将数组分为左右两个子数组,然后递归地对子数组进行排序。
快速排序的关键是选择合适的基准元素,以达到较好的效率。
快速排序的平均时间复杂度为O(nlogn),但在最差情况下时间复杂度为O(n^2)。
5. 归并排序(Merge Sort)归并排序是一种稳定且高效的排序算法。
它的基本思想是将数组划分为若干个子数组,然后递归地对子数组进行排序,并最后将排序好的子数组合并成一个有序数组。
归并排序的时间复杂度始终为O(nlogn),且不受数据分布的影响。
6. 堆排序(Heap Sort)堆排序是一种不稳定但高效的排序算法。
它的基本思想是将数组构建为一个二叉堆,然后通过重复删除堆顶元素并调整堆的操作,将最大(或最小)值移到数组的最后。
数据结构之排序算法

数据结构之排序算法数据结构之排序算法1、冒泡排序1.1 算法原理冒泡排序是一种简单的排序算法,通过重复从序列的起始位置开始比较相邻元素,不断交换位置来达到排序的目的。
每一轮排序后,最大(或最小)的元素都会被冒泡到序列的最末端。
1.2 算法步骤1)比较相邻的元素,如果前面的元素大于后面的元素,则交换位置。
2)重复进行第一步,直到遍历所有元素。
1.3 算法分析- 最坏时间复杂度:O(n^2)- 平均时间复杂度:O(n^2)- 最好时间复杂度:O(n)- 空间复杂度:O(1)- 稳定性:稳定排序2、快速排序2.1 算法原理快速排序是一种基于分治思想的排序算法,通过选择一个基准元素,将序列分成比基准元素小和大两部分,然后对两部分递归地进行排序,最终得到有序序列。
2.2 算法步骤1)选择一个基准元素。
2)将序列分成两部分,小于等于基准元素的放在左边,大于基准元素的放在右边。
3)对左右两部分递归地进行快速排序。
2.3 算法分析- 最坏时间复杂度:O(n^2)- 平均时间复杂度:O(nlogn)- 最好时间复杂度:O(nlogn)- 空间复杂度:O(logn)~O(n)- 稳定性:不稳定排序3、插入排序3.1 算法原理插入排序是一种简单直观的排序算法,将序列分为已排序和未排序两部分,每次从未排序部分取出一个元素,将其插入到已排序部分的正确位置,使得已排序部分仍然保持有序。
3.2 算法步骤1)将序列第一个元素视为已排序部分。
2)从未排序部分依次取出一个元素,与已排序部分从后往前比较,找到插入位置。
3)将该元素插入到已排序部分的正确位置。
4)重复步骤2和3,直到未排序部分为空。
3.3 算法分析- 最坏时间复杂度:O(n^2)- 平均时间复杂度:O(n^2)- 最好时间复杂度:O(n)- 空间复杂度:O(1)- 稳定性:稳定排序:::附件:- 附件1:排序算法示例代码(附件名:sortCode:zip)法律名词及注释:- 排序算法:指能够将一组元素按照特定的顺序排列的算法。
数据结构排序算法总结

数据结构排序算法总结一、概述排序算法是计算机科学中一个基础性的研究内容,是处理数据的关键技术,可以对数据结构中保存的数据,进行组织、分类、清洗等,使其有序化以便处理、查找、分析等。
排序算法分类:插入排序、交换排序、选择排序、归并排序、基数排序等。
二、插入排序插入排序一般来说称为直接插入排序,将待排序的数组划分为两个部分,左边是已经排好序的部分,右边是未排序的部分,每次从未排序的部分取出一个数据,把它插入到已排序的部分中的合适位置,使整个数组有序。
它的时间复杂度一般为O(n^2)。
三、交换排序交换排序是一种经典的排序算法,它的实现原理是:每次从数组中取出两个元素,比较它们的大小,如果顺序不对,就交换它们的位置;循环比较,直到所有的数据都按照大小顺序排列好。
典型的交换排序有:冒泡排序与快速排序等。
四、选择排序选择排序是一种基于比较的排序算法,它的实现原理是:每次从数组中取出一个最小的元素(最大的元素),放入另外一个数组中;拿下一个最小(最大)的元素,重复上面的操作,直到把所有的数据都放进了第二个数组中。
典型的有:简单选择排序、树形选择排序与堆排序等。
五、归并排序归并排序是一种分治法,它将一个数组拆分成两个,将这两个小数组分别拆分成更小的数组,直到拆分到只有一个或者两个数据;然后将拆分出来的子数组排序,后将排序完成的两个子数组归并为一个有序的数组,不断的向上将小的有序数组归并,直到把整个原数据归并为一个有序的数组。
六、基数排序基数排序是一种特殊的桶排序算法,它将输入的数据分解成几个关键字(位),按照关键字进行桶排序;依次排序每一位,最后将桶中的数据按照顺序连接起来,得到一个有序序列。
它的时间复杂度一般为O(d*n)。
七、总结排序算法是用来对数据结构中保存的数据进行排序以便处理、查找、分析等操作的一种基础性的研究内容,主要可以分为插入排序、交换排序、选择排序、归并排序、基数排序等几大类。
排序算法的复杂度也有所不同,是一个学习计算机科学不可缺少的内容。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
排序算法:(1) 直接插入排序 (2) 折半插入排序(3) 冒泡排序 (4) 简单选择排序 (5) 快速排序(6) 堆排序 (7) 归并排序【算法分析】(1)直接插入排序;它是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的序的有序表中,从而得到一个新的、记录数增加1的有序表。
(2)折半插入排序:插入排序的基本操作是在一个有序表中进行查找和插入,我们知道这个查找操作可以利用折半查找来实现,由此进行的插入排序称之为折半插入排序。
折半插入排序所需附加存储空间和直接插入相同,从时间上比较,折半插入排序仅减少了关键字间的比较次数,而记录的移动次数不变。
(3)冒泡排序:比较相邻关键字,若为逆序(非递增),则交换,最终将最大的记录放到最后一个记录的位置上,此为第一趟冒泡排序;对前n-1记录重复上操作,确定倒数第二个位置记录;……以此类推,直至的到一个递增的表。
(4)简单选择排序:通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1<=i<=n)个记录交换之。
(5)快速排序:它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
(6)堆排序: 使记录序列按关键字非递减有序排列,在堆排序的算法中先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录交换,然后对序列中前n-1记录进行筛选,重新将它调整为一个“大顶堆”,如此反复直至排序结束。
(7)归并排序:归并的含义是将两个或两个以上的有序表组合成一个新的有序表。
假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序称为2-路归并排序。
【算法实现】(1)直接插入排序:void InsertSort(SqList &L){for(i=2;i<=L.length ;i++)if(L.elem[i]<L.elem[i-1]){L.elem[0]=L.elem [i]; //复制为哨兵 L.elem [i]=L.elem [i-1];for(j=i-2;L.elem [j]>L.elem[0];j--)L.elem [j+1]=L.elem [j];L.elem [j+1]=L.elem[0];}}(2)折半插入排序:void BInsertSort(SqList &L){//对顺序表L作折半插入排序for(i=2;i<=L.length ;i++){L.elem[0]=L.elem [i];low=1; high=i-1;while(low<=high){m=(low+high)/2;if(L.elem [0]>L.elem [m]) low=m+1;else high=m-1;}for(j=i-1;j>=high+1;j--)L.elem [j+1]=L.elem [j];L.elem [high+1]=L.elem[0];}}(3)冒泡排序:void BubbleSort(SqList &L){for(i=L.length;i>=2;i--)for(j=1;j<i;j++)if(L.elem[j]>L.elem [j+1])L.elem [j]↔L.elem [j+1];}(4)简单选择排序:void SelectSort(SqList &L){for(int i=1;i<=L.length-1 ;i++){j=SelectMinKey(L,i); //在L.elem[i..L.length]中选择最小记录if(i!=j) L.elem [i]↔L.elem [index];}}(5)快速排序:int Partition(SqList &L,int low,int high){//将L.elem[low...high]一分为二pivot=L.elem[low];while(low<high){while(low<high&&L.elem[high]>=pivot) high--;L.elem[low]↔L.elem[high];while(low<high&&L.elem[high]<=pivot) low++;L.elem[low]↔L.elem[high];}return low;}void QSort(SqList &L,int low,int high){//对顺序表L中的子序列L.elem[low...high]进行快速排序if(low<high){pivot=Partition(L,low,high);QSort(L,low,pivot-1);QSort(L,pivot+1,high);}}void QuickSort(SqList &L) {//对顺序表L作快速排序QSort(L,1,L.length);}(6)堆排序:void HeapAdjust(SqList &L,int s,int m){L.elem[0]=L.elem[s];for(j=2*s;j<=m;j*=2){if(j<m&&L.elem[j]<L.elem[j+1]) j++;if(!(L.elem[0]<L.elem[j])) break;L.elem[s]=L.elem[j];s=j;}L.elem[s]=L.elem[0];}void HeapSort(SqList &L){for(i=L.length/2;i>0;i--)HeapAdjust(L,i,L.length);for(i=L.length;i>1;i--){LL.elem[1]↔ L.elem[i];HeapAdjust(L,1,i-1);}}(7)归并排序:void Merge(SqList L,SqList &L1,int i,int m,int n){//将有序的L[i..m]和L[m+1..n]归并为有序的L1[i..n] for(j=m+1,k=i;i<=m&&j<=n;++k)if(L.elem[i]<L.elem[j]) L1.elem[k]=L.elem[i++];else L1.elem[k]=L.elem[j++];if(i<=m) L1[k..n] =L[i..m];if(j<=n) L1[k..n] =L[j..n];}void MSort(SqList L,SqList &L1,int s,int t){//将L[s..t]归并排序为L1[s..t]。
if(s==t) L1.elem[s]=L.elem[s];else{m=(s+t)/2;MSort(L,L2,s,m);MSort(L,L2,m+1,t);Merge(L2,L1,s,m,t);}}void MergeSort(SqList &L){//对顺序表L作归并排序MSort(L,L,1,L.length);}【源代码】见.cpp文件。
【算法分析】【总结】简单排序中直接插入排序最好,快速排序最快,当文件为正序,直接插入排序和冒泡排序均最佳。
排序算法的选择:1.若n(待排序的记录数)较小,可采用直接插入排序或选择排序。
当记录规模较小时,直接插入排序较好:否则因为选择移动的记录数少于直接插入,应选选择排序。
2.若文件初始状态基本有序(正序),则应选用直接插入排序、冒泡排序或快速排序。
3.若n较大,则应采用时间复杂度为O(nlgn)的排序算法:快速排序、堆排序极品归并排序。
当待排序的关键字是随机分布时,快速排序的平均时间最短;堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。
这两种排序都是不稳定的;若要求排序稳定,则可选用归并排序。
#include<stdio.h>#include<stdlib.h>typedef struct //顺序表存储结构{int * elem;int length;}SqList;int main(void){SqList L;SqList L1;void InsertSort(SqList &L); //直接插入排序 void BInsertSort(SqList &L); //折半插入排序void BubbleSort(SqList &L); //冒泡排序void SelectSort(SqList &L); //简单选择排序void QuickSort(SqList &L); //快速排序void QSort(SqList &L,int low,int high);int Partition(SqList &L,int low,int high);void HeapSort(SqList &L); //堆排序void HeapAdjust(SqList &L,int s,int m);void MergeSort(SqList &L); //归并排序void MSort(SqList L,SqList &L1,int s,int t);void Merge(SqList L,SqList &L1,int i,int m,int n);int n;int * p;printf("请输入顺序表的长度:");scanf("%d",&n);if((p=(int *)malloc((n+1)*sizeof(int)))==0) //动态分配顺序表存储空间{printf("Not able to allocate memory.\n");exit(1);}L.length=n;if((p=(int *)malloc((n+1)*sizeof(int)))==0) //动态分配顺序表存储空间{printf("Not able to allocate memory.\n");exit(1);}L1.elem=p;L1.length=n;printf("请输入%d个整数:\n",n); //输入一组待排序的数据for(int i=1;i<=L.length;i++)scanf("%d",&L.elem[i]);printf("选择排序算法:\n");printf("1 直接插入排序\n");printf("2 折半插入排序\n");printf("3 冒泡排序\n");printf("4 简单选择排序\n");printf("5 快速排序\n");printf("6 堆排序\n");printf("7 归并排序\n");int change=0;scanf("%d",&change);switch(change){case 1: InsertSort(L);break;case 2: BInsertSort(L);break;case 3: BubbleSort(L);break;case 4: SelectSort(L);break;case 5: QuickSort(L);break;case 6: HeapSort(L);break;case 7: MergeSort(L);break;default:break;}printf("排序后为:");for(i=1;i<=L.length;i++)printf("%6d",L.elem[i]);printf("\n");return 0;}void InsertSort(SqList &L){int i=0,j=0;for(i=2;i<=L.length ;i++)if(L.elem[i]<L.elem[i-1]){L.elem[0]=L.elem [i]; //复制为哨兵L.elem [i]=L.elem [i-1];for(j=i-2;L.elem [j]>L.elem[0];j--)L.elem [j+1]=L.elem [j];L.elem [j+1]=L.elem[0];}}void BInsertSort(SqList &L){int i=0,j=0,low=0,high=0,m=0;for(i=2;i<=L.length ;i++){L.elem[0]=L.elem [i];low=1;high=i-1;while(low<=high){m=(low+high)/2;if(L.elem [0]>L.elem [m])low=m+1;elsehigh=m-1;}for(j=i-1;j>=high+1;j--)L.elem [j+1]=L.elem [j];L.elem [high+1]=L.elem[0];}}void BubbleSort(SqList &L){int i=0,j=0;for(i=L.length;i>=2;i--)for(j=1;j<i;j++){if(L.elem[j]>L.elem [j+1]){L.elem[0]=L.elem [j];L.elem [j]=L.elem [j+1];L.elem [j+1]=L.elem[0];}}}void SelectSort(SqList &L){int index=0;for(int i=1;i<=L.length-1 ;i++){index=i;for(int j=i+1;j<=L.length ;j++)if(L.elem [j]<L.elem [index])index=j;if(i!=index){L.elem[0]=L.elem [i];L.elem [i]=L.elem [index];L.elem [index]=L.elem[0];}}}//快排int Partition(SqList &L,int low,int high){//将L.elem[low...high]一分为二int pivot=0; //用子表第一个记录作枢轴pivot=L.elem[low];while(low<high){while(low<high&&L.elem[high]>=pivot)high--;L.elem[0]=L.elem[low];L.elem[low]=L.elem[high];L.elem[high]=L.elem[0];while(low<high&&L.elem[high]<=pivot)low++;L.elem[0]=L.elem[low];L.elem[low]=L.elem[high];L.elem[high]=L.elem[0];}return low;}void QSort(SqList &L,int low,int high){//对顺序表L中的子序列L.elem[low...high]进行快速排序 int pivot=0;if(low<high){pivot=Partition(L,low,high);QSort(L,low,pivot-1);QSort(L,pivot+1,high);}}void QuickSort(SqList &L){QSort(L,1,L.length);}//堆排void HeapAdjust(SqList &L,int s,int m){int j=0;L.elem[0]=L.elem[s];for(j=2*s;j<=m;j*=2){if(j<m&&L.elem[j]<L.elem[j+1])j++;if(!(L.elem[0]<L.elem[j]))break;L.elem[s]=L.elem[j];s=j;}L.elem[s]=L.elem[0];}void HeapSort(SqList &L){int i=0;for(i=L.length/2;i>0;i--)HeapAdjust(L,i,L.length);for(i=L.length;i>1;i--){L.elem[0]=L.elem[1];L.elem[1]=L.elem[i];L.elem[i]=L.elem[0];HeapAdjust(L,1,i-1);}}//归并void Merge(SqList L,SqList &L1,int i,int m,int n){int j=0,k=0,p=0,q=0;for(j=m+1,k=i;i<=m&&j<=n;++k){if(L.elem[i]<L.elem[j])L1.elem[k]=L.elem[i++];elseL1.elem[k]=L.elem[j++];}if(i<=m)for(p=k,q=i;q<=m;p++,q++)L1.elem[p]=L.elem[q];if(j<=n)for(p=k,q=j;q<=n;p++,q++)L1.elem[p]=L.elem[q];}void MSort(SqList L,SqList &L1,int s,int t){SqList L2;int * p;if((p=(int *)malloc((t-s+1)*sizeof(int)))==0) //动态分配顺序表存储空间{printf("Not able to allocate memory.\n");exit(1);}L2.elem=p;L2.length=t-s+1;int m=0;if(s==t)L1.elem[s]=L.elem[s];else{m=(s+t)/2;MSort(L,L2,s,m);MSort(L,L2,m+1,t);Merge(L2,L1,s,m,t);}}void MergeSort(SqList &L){MSort(L,L,1,L.length);}。