现在的位置: 首页 > 综合 > 正文

排序问题总结

2013年04月22日 ⁄ 综合 ⁄ 共 1721字 ⁄ 字号 评论关闭

一、插入排序

1、直接插入

主要讲的是直接插入排序的方法:

思路是:

将第I个记录插入到已经有序的I-1个记录中(其中I>1,因为当I=1时记录为一个有序记录,不用进行插入)

具体步骤:

给出待排序记录{45,38,66,90,88,10,25}

第一回合:I=2(38插入到45)则有序数列为:38,45

第二回合:I=3(66插入到有序数列中)则有:38,45,66

第三回合:I=4(90插入到有序数列中)则有:38,45,66,90

第四回合:I=5(88插入到有序数列中)则有:38,45,66,88,,90

第五回合:I=6(10插入到有序数列中)则有:10,38,45,66,88,90

第六回合:I=7(25插入到有序数列中)则有:10,25,,38,45,66,88,90

二、交换排序

主要讲了冒泡排序和快速排序

1、冒泡排序

思路是:

从第一个记录开始,第I个和I+1个记录进行比较,若I>I+1则交换两个值

具体步骤:

给出待排序记录{45,38,66,90,88,10,25}

第一回合:进行交换的两个值为45,38 需交换得:38,45

第二回合,进行交换的两个值为45,66 需交换得:45,66

第三回合,进行交换的两个值为66,90 需交换得:66,90

第四回合,进行交换的两个值为90,88 需交换得:88,90

第五回合,进行交换的两个值为90,10 需交换得:10,90

第六回合,进行交换的两个值为90,25 需交换得:25,90

第一趟排序结束:顺序为:38,45,66,88,10,25,90

第二趟的回合与第一趟类似,

得出排序结果是:38,45,66,10,25,88,90

第三趟排序结果:38,45,10,25,66,88,90

第四趟排序结果:38,10,25,45,66,88,90

第五趟排序结果:10,25,38,45,66,88,90

结束

2、快速排序

思路是:

是冒泡排序的优化,到现在为止还不知道该如何用语言来描述这个过程

具体步骤:

给出待排序记录{45,38,66,90,88,10,25}

取出45作为初始比较的数据

则有:

第一回合:25,38,66,90,88,10,25

第二回合:25,38,66,90,88,10,66

第三回合:25,38,10,90,88,10,66

第四回合:25,38,10,90,88,90,66,

第五回合:25,38,10,88,88,90,66
此时第四位与第五位相同
则将45放到第四位

第一趟排序结束有:25,38,10,45,88,90,66

然后分别对25,38,1088,90,66进行快速排序详细步骤有:

对于25,38,10

第一回合有:10,38,10

第二回合有:10,38,38   
得出:10,25,38

对于88,90,66

第一回合有:66,90,66

第二回合有:66,90,90 
得出:66,88,90

所以最终结果有:10,25,38,45,66,88,90

 

三、选择排序

基本思想是:每一次在n-i+1个记录中选取键值最小的记录作为有序序列的第i个记录

1、直接选择

思路是:第i次选择操作中,通过n-i次比较,从记录中获得最小值,并和第i个记录进行交换

具体实现步骤:

给出待排序记录{45,38,66,90,88,10,25}

注:(蓝色字体为有序部分)

第一趟排序结果:10,38,66,90,88,45,25

第二趟排序结果:10,25,66,90,88,45,38

第三趟排序结果:10,25,38,90,88,45,66

第四趟排序结果:10,25,38,45,88,90,66

第五趟排序结果:10,25,38,45,66,90,88

第六趟排序结果:10,25,38,45,66,88,90

所以最终结果是:10,25,38,45,66,88,90

2、堆排序

思想是:借用二叉树,任一结点的值都不大(小)于它的两个孩子的值

具体实现:
第一步:将给定数值建成一颗完全二叉树

第二步:从n/2开始,把这些元素以上的结点,进行筛选成堆

筛选成堆的具体实现是:

如果其父结点的大于任一子结点,则进行交换。使得父节点小于任一子节点。

介绍了这么多排序的实现方法,每次看到概念都是晕乎乎的,还是自己实现起来比较清晰。

抱歉!评论已关闭.