欢迎来到天天文库
浏览记录
ID:26395188
大小:51.00 KB
页数:8页
时间:2018-11-26
《排序算法总结26216》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、排序算法总结所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。当待排序记录的关键字都不相同时,排序结果是惟一的,否则排序结果不惟一。 在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的。 要注意的是,排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。一.插入排序 插入排序的基本思
2、想是每步将一个待排序的记录按其排序码值的大小,插到前面已经排好的文件中的适当位置,直到全部插入完为止。插入排序方法主要有直接插入排序和希尔排序。①.直接插入排序(稳定) 接插入排序的过程为:在插入第i个记录时,R1,R2,..Ri-1已经排好序,将第i个记录的排序码Ki依次和R1,R2,..,Ri-1的排序码逐个进行比较,找到适当的位置。使用直接插入排序,对于具有n个记录的文件,要进行n-1趟排序。代码如下:voidDir_Insert(intA[],intN) //直接插入排序{ intj,t; for(inti=1;i3、;i++) { t=A[i]; j=i-1; while(A[j]>t) { A[j+1]=A[j]; j--; } A[j+1]=t; }}②.希尔排序(不稳定):8 希尔(Shell)排序的基本思想是:先取一个小于n的整数d1作为第一个增量把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取得第二个增量d24、增量di=1,即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。 一般取d1=n/2,di+1=di/2。如果结果为偶数,则加1,保证di为奇数。 希尔排序是不稳定的,希尔排序的执行时间依赖于增量序列,其平均时间复杂度为O(n^1.3).代码如下:voidShell(intA[],intn) //Shell排序{ inti,j,k,t; (n/2)%2==0?k=n/2+1:k=n/2;//保证增量为奇数 while(k>0) { for(j=k;j5、 { t=A[j]; i=j-k; while(i>=0&&A[i]>t) { A[i+k]=A[i]; i=i-k; } A[i+k]=t; } if(k==1)break; (k/2)%2==0?k=k/2+1:k=k/2; }}二.选择排序 选择排序的基本思想是每步从待排序的记录中选出排序码6、最小的记录,顺序存放在已排序的记录序列的后面,直到全部排完。选择排序中主要使用直接选择排序和堆排序。 ①.直接选择排序(不稳定)8 直接选择排序的过程是:首先在所有记录中选出序码最小的记录,把它与第1个记录交换,然后在其余的记录内选出排序码最小的记录,与第2个记录交换......依次类推,直到所有记录排完为止。 无论文件初始状态如何,在第i趟排序中选出最小关键字的记录,需要做n-i次比较,因此,总的比较次数为n(n-1)/2=O(n^2)。当初始文件为正序时,移动次数为0;文件初态为反序时,每趟排序均要执行交换操作,总的移动次数7、取最大值3(n-1)。直接选择排序的平均时间复杂度为O(n^2)。直接选择排序是不稳定的。代码如下:voidDir_Choose(intA[],intn) //直接选择排序{ intk,t; for(inti=0;i8、]=A[k]; A[k]=t; } }}②.堆排序(不稳定) 堆排序是一种树形选择排序,
3、;i++) { t=A[i]; j=i-1; while(A[j]>t) { A[j+1]=A[j]; j--; } A[j+1]=t; }}②.希尔排序(不稳定):8 希尔(Shell)排序的基本思想是:先取一个小于n的整数d1作为第一个增量把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取得第二个增量d24、增量di=1,即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。 一般取d1=n/2,di+1=di/2。如果结果为偶数,则加1,保证di为奇数。 希尔排序是不稳定的,希尔排序的执行时间依赖于增量序列,其平均时间复杂度为O(n^1.3).代码如下:voidShell(intA[],intn) //Shell排序{ inti,j,k,t; (n/2)%2==0?k=n/2+1:k=n/2;//保证增量为奇数 while(k>0) { for(j=k;j5、 { t=A[j]; i=j-k; while(i>=0&&A[i]>t) { A[i+k]=A[i]; i=i-k; } A[i+k]=t; } if(k==1)break; (k/2)%2==0?k=k/2+1:k=k/2; }}二.选择排序 选择排序的基本思想是每步从待排序的记录中选出排序码6、最小的记录,顺序存放在已排序的记录序列的后面,直到全部排完。选择排序中主要使用直接选择排序和堆排序。 ①.直接选择排序(不稳定)8 直接选择排序的过程是:首先在所有记录中选出序码最小的记录,把它与第1个记录交换,然后在其余的记录内选出排序码最小的记录,与第2个记录交换......依次类推,直到所有记录排完为止。 无论文件初始状态如何,在第i趟排序中选出最小关键字的记录,需要做n-i次比较,因此,总的比较次数为n(n-1)/2=O(n^2)。当初始文件为正序时,移动次数为0;文件初态为反序时,每趟排序均要执行交换操作,总的移动次数7、取最大值3(n-1)。直接选择排序的平均时间复杂度为O(n^2)。直接选择排序是不稳定的。代码如下:voidDir_Choose(intA[],intn) //直接选择排序{ intk,t; for(inti=0;i8、]=A[k]; A[k]=t; } }}②.堆排序(不稳定) 堆排序是一种树形选择排序,
4、增量di=1,即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。 一般取d1=n/2,di+1=di/2。如果结果为偶数,则加1,保证di为奇数。 希尔排序是不稳定的,希尔排序的执行时间依赖于增量序列,其平均时间复杂度为O(n^1.3).代码如下:voidShell(intA[],intn) //Shell排序{ inti,j,k,t; (n/2)%2==0?k=n/2+1:k=n/2;//保证增量为奇数 while(k>0) { for(j=k;j5、 { t=A[j]; i=j-k; while(i>=0&&A[i]>t) { A[i+k]=A[i]; i=i-k; } A[i+k]=t; } if(k==1)break; (k/2)%2==0?k=k/2+1:k=k/2; }}二.选择排序 选择排序的基本思想是每步从待排序的记录中选出排序码6、最小的记录,顺序存放在已排序的记录序列的后面,直到全部排完。选择排序中主要使用直接选择排序和堆排序。 ①.直接选择排序(不稳定)8 直接选择排序的过程是:首先在所有记录中选出序码最小的记录,把它与第1个记录交换,然后在其余的记录内选出排序码最小的记录,与第2个记录交换......依次类推,直到所有记录排完为止。 无论文件初始状态如何,在第i趟排序中选出最小关键字的记录,需要做n-i次比较,因此,总的比较次数为n(n-1)/2=O(n^2)。当初始文件为正序时,移动次数为0;文件初态为反序时,每趟排序均要执行交换操作,总的移动次数7、取最大值3(n-1)。直接选择排序的平均时间复杂度为O(n^2)。直接选择排序是不稳定的。代码如下:voidDir_Choose(intA[],intn) //直接选择排序{ intk,t; for(inti=0;i8、]=A[k]; A[k]=t; } }}②.堆排序(不稳定) 堆排序是一种树形选择排序,
5、 { t=A[j]; i=j-k; while(i>=0&&A[i]>t) { A[i+k]=A[i]; i=i-k; } A[i+k]=t; } if(k==1)break; (k/2)%2==0?k=k/2+1:k=k/2; }}二.选择排序 选择排序的基本思想是每步从待排序的记录中选出排序码
6、最小的记录,顺序存放在已排序的记录序列的后面,直到全部排完。选择排序中主要使用直接选择排序和堆排序。 ①.直接选择排序(不稳定)8 直接选择排序的过程是:首先在所有记录中选出序码最小的记录,把它与第1个记录交换,然后在其余的记录内选出排序码最小的记录,与第2个记录交换......依次类推,直到所有记录排完为止。 无论文件初始状态如何,在第i趟排序中选出最小关键字的记录,需要做n-i次比较,因此,总的比较次数为n(n-1)/2=O(n^2)。当初始文件为正序时,移动次数为0;文件初态为反序时,每趟排序均要执行交换操作,总的移动次数
7、取最大值3(n-1)。直接选择排序的平均时间复杂度为O(n^2)。直接选择排序是不稳定的。代码如下:voidDir_Choose(intA[],intn) //直接选择排序{ intk,t; for(inti=0;i8、]=A[k]; A[k]=t; } }}②.堆排序(不稳定) 堆排序是一种树形选择排序,
8、]=A[k]; A[k]=t; } }}②.堆排序(不稳定) 堆排序是一种树形选择排序,
此文档下载收益归作者所有