基本排序算法思想

来源:互联网 发布:航天一院702所 知乎 编辑:程序博客网 时间:2024/04/29 04:36

1. 插入排序 

  每步将一个待排序的对象, 按其排序码大小,  插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止 

 21,25,49,25,16,08

 第一趟: 21,25,49,25,16,08

 第二趟: 21,25,49,25,16,08

 第三趟: 21,25,25,49,16,08

 第四趟: 16,21,25,25,49,08

 第五趟: 08,1,21,25,25,49

2.起泡排序

  设待排序对象序列中的对象个数为n。一般地,i趟起泡排序从1n-i+1依次比较相邻两个记录地关键字,如果发生逆序,则交换之,其结果是这n-i+1个记录中,关键字最大的记录被交换到第n-i+1的位置上,最多作n-1

3.选择排序

 每一趟 (例如第 i , i = 0, 1, …, n-2) 在后面 n-i 个待排序,记录中选出排序码最小的记录,  作为有序序列中的第 i 个记录。待到第n-2 趟作完, 待排序记录只剩下1,就不用再选了。

初始关键字 【49 38 65 97 76 13 27 49】
第一趟排序后 13 [38 65 97 76 49 27 49】
第二趟排序后 13 27 [65 97 76 49 38 49】
第三趟排序后 13 27 38 【97 76 49 65 49】
第四趟排序后 13 27 38 49 【49 97 65 76】
第五趟排序后 13 27 38 49 49 【97 97 76】
第六趟排序后 13 27 38 49 49 76 【76 97】
第七趟排序后 13 27 38 49 49 76 76 【 97】
最后排序结果 13 27 38 49 49 76 76 97

4.快速排序

  任取待排序对象序列中的某个对象 (例如取第一个对象) 作为基准, 按照该对象的排序码大小,将整个对象序列划分为左右两个子序列:

u左侧子序列中所有对象的排序码都小于或等于基准对象的排序码

u右侧子序列中所有对象的排序码都大于基准对象的排序码

基准对象则排在这两个子序列中间(这也是该对象最终应安放的位置)然后分别对这两个子序列重复施行上述方法,直到所有的对象都排在相应位置上为止。基准对象也称为枢轴(或支点)记录

初始关键数据X:=49)

49 38 65 97 76 13 27

进行第一次交换后: 27 38 65 97 76 13 49

进行第二次交换后: 27 38 49 97 76 13 65

进行第三次交换后: 27 38 13 97 76 49 65

进行第四次交换后: 27 38 13 49 76 97 65
此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27 38 13 49 76 97 65

快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序

5.归并排序

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列

 初始状态: [6] [202] [100] [301] [38] [8] [1] 比较次数

  i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3

  i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4

  i=3 [ 1 6 8 38 100 202 301 ] 4

  总计: 11次

 

6. 希尔排序

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

 

{94,12,34,76,26,9,0,37,55,76,37,5,68,83,90,37,12,65,76,49},数组大小为20。
首先,初始化d = 20。在循环中反复得到间隔d,根据d执行一趟希尔排序。
对于d = 20/2 = 10:
根据d = 10来对数组排序,将原始数组分成2块:
{94,12,34,76,26,9,0,37,55,76}与{37,5,68,83,90,37,12,65,76,49},也就是对如下数组分别进行直接插入排序:
{array[0],array[10]} = {94,37}
{array[1],array[11]} = {12,5}
{array[2],array[12]} = {34,68}
{array[3],array[13]} = {76,83}
{array[4],array[14]} = {26,90}
{array[5],array[15]} = {9,37}
{array[6],array[16]} = {0,12}
{array[7],array[17]} = {37,65}
{array[8],array[18]} = {55,76}
{array[9],array[19]} = {76,49}
第一趟希尔排序后,各个子数组变为:
{37,5,34,76,26,9,0,37,55,49}与{94,12,68,83,90,37,12,65,76,76},
即:array = {37,5,34,76,26,9,0,37,55,49,94,12,68,83,90,37,12,65,76,76},
对于d = 10/2 = 5:
根据d = 5来对数组排序,将第一趟希尔排序后的数组分成4块
:{37,5,34,76,26}、{9,0,37,55,49}、{94,12,68,83,90}与{37,12,65,76,76},也就是对如下数组分别进行直接插入排序:
{array[0],array[5],array[10],array[15]} = {37,9,94,37}
{array[1],array[6],array[11],array[16]} = {5,0,12,12}
{array[2],array[7],array[12],array[17]} = {34,37,68,65}
{array[3],array[8],array[13],array[18]} = {76,55,83,76}
{array[4],array[9],array[14],array[19]} = {26,49,90,76}
第二趟希尔排序后,各个子数组变为:
{9,0,34,55,26}、{37,5,37,76,49}、{37,12,65,76,76}与{94,12,68,83,90},
即:array = {9,0,34,55,26,37,5,37,76,49,37,12,65,76,76,94,12,68,83,90}。
对于d = 5/2 = 2:
根据d = 2来对数组排序,将第二趟希尔排序后的数组分成10块:
{9,0}、{34,55}、{26,37}、{5,37}、{76,49}、{37,12}、{65,76}、{76,94}、{12,68}与{83,90},也就是对如下数组分别进行直接插入排序:
{array[0],array[2],array[4],array[6],array[8],array[10],array[12],array[14],array[16],array[18]}
= {9,34,26,5,76,37,65,76,12,83}
{array[1],array[3],array[5],array[7],array[9],array[11],array[13],array[15],array[17],array[19]}
= {0,55,37,37,49,12,76,94,68,90}
第三趟希尔排序后,各个子数组变为:{5,0}、{9,12}、{12,37}、{26,37}、{34,49}、{37,55}、{65,68}、{76,76}、{76,90}与{83,94},
即:array = :{5,0,9,12,12,37,26,37,34,49,37,55,65,68,76,76,76,90,83,94}。
对于d = 2/2 = 1:
根据d =
1来对数组排序,将第二趟希尔排序后的数组分成20块:{5}、{0}、{9}、{12}、{12}、{37}、{26}、{37}、{34}、{49}、{37}、{55}、{65}、{68}、{76}、{76}、{76}、{90}、{83}、{94},也就是对如下数组分别进行直接插入排序:
{5,0,9,12,12,37,26,37,34,49,37,55,65,68,76,76,76,90,83,94}
第四趟希尔排序以后,数组已经有序:
array = {0,5,9,12,12,26,34,37,37,37,49,55,65,68,76,76,76,83,90,94}。
因为 d= 1,希尔排序结束。

 

原创粉丝点击