欢迎来到天天文库
浏览记录
ID:51057693
大小:126.50 KB
页数:21页
时间:2020-03-08
《各种排序方法汇总.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一.选择排序1.选择排序法基本思想: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。2.排序过程:【示例】: 初始关键字[4938659776132749]第一趟排序后13[38659776492749]第二趟排序后1327[659776493849]第三趟排序后132738[9776496549]第四趟排序后13273849[49976576]第五趟排序后1327384949[979776]第六趟排序后132738494976[7697]第七趟排序后1
2、3273849497676[97]最后排序结果13273849497676973.voidselectionSort(Type*arr,longlen){ longi=0,j=0;/*iteratorvalue*/ longmaxPos; assertF(arr!=NULL,"InInsertSortsort,arrisNULL"); for(i=len-1;i>=1;i--) { maxPos=i; for(j=0;j if(arr[ma
3、xPos]
if(maxPos!=i)swapArrData(arr,maxPos,i); }}选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,有比当前外层循环位置更小的元素,需要将这两个元素交换.二.直接插入排序插入排序(InsertionSort)的基本思想是:每次将一个待排
4、序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。直接插入排序 直接插入排序(StraightInsertionSort):将一个记录插入到排好序的有序表中,从而得到一个新的、记录数增1的有序表。直接插入排序算法 哨兵(监视哨)有两个作用:一是作为临变量存放R[i](当前要进行比较的关键字)的副本;二是在查找循环中用来监视下标变量j是否越界。 当文件的初始状态不同时,直接插入排序所耗费的时间是有很大差异的。最好情况是文件初态为正序,此时算法的时间复杂度为O(n),最坏情况是文件
5、初态为反序,相应的时间复杂度为O(n2),算法的平均时间复杂度是O(n2)。算法的辅助空间复杂度是O(1),是一个就地排序。直接插入排序是稳定的排序方法。三.冒泡排序[算法思想]:将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。 [算法]: voidBubbleSort(SeqListR){ //R(l
6、..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序 inti,j; Booleanexchange;//交换标志 for(i=1;i<> exchange=FALSE;//本趟排序开始前,交换标志应为假 for(j=n-1;j>=i;j--)//对当前无序区R[i..n]自下向上扫描 if(R[j+1].key<> R[0]=R[j+1];//R[0]不是哨兵,仅做暂存
7、单元 R[j+1]=R[j]; R[j]=R[0]; exchange=TRUE;//发生了交换,故将交换标志置为真 } if(!exchange)return;//本趟排序未发生交换,提前终止算法 }//endfor(外循环) }//BubbleSort [分析]:起泡排序的结束条件为:最后一趟没有进行“交换”。从起泡排序的过程可见,起
8、泡排序是一个增加有序序列长度的过程,也是一个缩小无序序列长度的过程,每经过一趟起泡,无序序列的长度只缩小1。[算法思想]:将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描
此文档下载收益归作者所有