C语言排序专题

        有下列一组关键字序列,分别用冒泡排序,希尔排序,直接选择排序,直接插入排序,快速排序,基数排序,归并排序对此序列进行排序。

        关键字序列{757,268,304,527,835,942,394,581,373,871}

1、冒泡排序(【】内表示无序区)

初始态:【757 268 304 527 835 942 394 581 373 871】

第一趟:268 304 527 757 835 394 581 373 871 942

第二趟:268 304 527 757 394 581 373 835 871 942

第三趟:268 304 527 394 581 373 757 835 871 942

第四趟:268 304 394 527 373 581 757 835 871 942

第五趟:268 304 394 373 527 581 757 835 871 942

第六趟:268 304 373 394 527 581 757 835 871 942

冒泡排序: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 

 

2、希尔排序(增量为5,3,1)

初始态:757 268 304 527 835 942 394 581 373 871

第一趟:757 268 304 373 835 942 394 581 527 871

第二趟:373 268 304 394 581 527 757 835 942 871

第三趟:268 304 373 394 527 581 757 835 871 942

希尔排序:把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

 

 

3、直接选择排序(【】内表示无序区)

初始态:【757 268 304 527 835 942 394 581 373 871】

第一趟:268【757 304 527 835 942 394 581 373 871】

第二趟:268 304【757 527 835 942 394 581 373 871】

第三趟:268 304 373【527 835 942 394 581 757 871】

第四趟:268 304 373 394【835 942 527 581 757 871】

第五趟:268 304 373 394 527【942 835 581 757 871】

第六趟:268 304 373 394 527 581【835 942 757 871】

第七趟:268 304 373 394 527 581 757【942 835 871】

第八趟:268 304 373 394 527 581 757 835【942 871】

第九趟:268 304 373 394 527 581 757 835 871 942

直接选择排序:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。

 

 

4、直接插入排序(【】内表示无序区)

初始态:【757 268 304 527 835 942 394 581 373 871】

第一趟:268 757【304 527 835 942 394 581 373 871】

第二趟:268 304 757【527 835 942 394 581 373 871】

第三趟:268 304 527 757【835 942 394 581 373 871】

第四趟:268 304 527 757 835【942 394 581 373 871】

第五趟:268 304 527 757 835 942【394 581 373 871】

第六趟:268 304 394 527 757 835 942【581 373 871】

第七趟:268 304 394 527 757 835 942 581【373 871】

第八趟:268 304 373 394 527 757 835 942 581【871】

第九趟:268 304 373 394 527 581 757 835 871 942

直接插入排序:在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。依此法对所有元素进行插入,直到整个序列排为有序。

 

 

5、快速排序(【】内表示无序区,层表示对应的递归树的层数)

初始态:【757 268 304 527 835 942 394 581 373 871】

第一层:【 268 304 】373【757 527 835 942 394 581 871】

第二层:268【 304 】373【527 394】581【757 835 942 871】

第三层:268  304 373 394【527】581【757 835 942 871】

第四层:268  304 373 394 527 581【757 835】871【942】

第五层:268  304 373 394 527 581 757【 835】871 942

第六层:268  304 373 394 527 581 757 835 871 942

快速排序:
(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。
(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
(3)对左边和右边的数据独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

 

 

6、基数排序(【】表示队列,队列号从0到9)

初始态:757 268 304 527 835 942 394 581 373 871

第一趟:【】【581 871】【942】【373】【304 394】【835】【】【527 757】【268】【】

第二趟:【304】【】【527】【835】【942】【757】【268】【373 871】【581】【394】

第三趟:【】【】【268】【304 373 394】【】【527 581】【】【757】【835 871】【942】

基数排序:准备10个数组(0~9对应位数的0~9)
     (1)按照个位数进行排序,放入数组。
     (2)按照十位数进行排序,放入数组。
   (3)按照百位数进行排序,放入数组。
     排序后,数列就变成了一个有序序列。

 

7、归并排序(此处采用自底向上的归并,【】表示有序区)

初始态:【757】【268】【304】【527】【835】【942】【394】【581】【373】【871】

第一趟:【268 757】【304 527】【835 942】【394 581】【373 871】

第二趟:【268 304 527 757】【394 581 835 942】【373 871】

第三趟:【268 304 394 527 581 757 835 942】【373 871】

第四趟:【268 304 373 394 527 581 757 835 871 942】

归并排序:将已有序的子序列合并,得到完全有序的序列。即先使每个子序列有序,再使子序列段间有序,将多个有序表合并成一个有序表。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃橘子的橘猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值