总结下排序算法——MoreWindows白话经典算法之七大排序总结篇

MoreWindows
《白话经典算法》、《秒杀多线程》作者
博客专家认证
2012-12-03 07:09:13
论坛上常常有人问到排序算法,因此对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法进行总结,方便初学者全面的掌握这些基础知识。

一. 冒泡排序
冒泡排序主要思路是:
通过交换使相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。

冒泡排序改进1:在某次遍历中如果没有数据交换,说明整个数组已经有序。因此通过设置标志位来记录此次遍历有无数据交换就可以判断是否要继续循环。

冒泡排序改进2:记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序了。因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。


二. 直接插入排序
直接插入排序主要思路是:
每次将一个待排序的数据,插入到前面已经排好序的序列之中,直到全部数据插入完成。


三. 直接选择排序
直接选择排序主要思路是:
数组分成有序区和无序区,初始时整个数组都是无序区,然后每次从无序区选一个最小的元素直接放到有序区的最后,直到整个数组变有序区。


四. 希尔排序
希尔排序主要思路是:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。由于希尔排序是对相隔若干距离的数据进行直接插入排序,因此可以形象的称希尔排序为“跳着插”


五. 归并排序
归并排序主要思路是:
当一个数组左边有序,右边也有序,那合并这两个有序数组就完成了排序。如何让左右两边有序了?用递归!这样递归下去,合并上来就是归并排序。


六. 快速排序
快速选择排序主要思路是:
“挖坑填数+分治法”,首先令i =L; j = R; 将a[i]挖出形成第一个坑,称a[i]为基准数。然后j--由后向前找比基准数小的数,找到后挖出此数填入前一个坑a[i]中,再i++由前向后找比基准数大的数,找到后也挖出此数填到前一个坑a[j]中。重复进行这种“挖坑填数”直到i==j。再将基准数填入a[i]中,这样i之前的数都比基准数小,i之后的数都比基准数大。因此将数组分成二部分再分别重复上述步骤就完成了排序。

七. 堆排序
堆排序主要思路用张图示来表示更好:

可见堆排序的难点就在于堆的的插入和删除。

堆的插入就是——每次插入都是将新数据放在数组最后,而从这个新数据的父结点到根结点必定是一个有序的数列,因此只要将这个新数据插入到这个有序数列中即可。

堆的删除就是——堆的删除就是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。调整时先在左右儿子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点。相当于从根结点开始将一个数据在有序数列中进行“下沉”。

因此,堆的插入和删除非常类似直接插入排序,只不是在二叉树上进行插入过程。所以可以将堆排序形容为“树上插”


再用一张图表示下这七种常用的排序方法的关系。



图片如果不能访问请访问原博客文章
http://blog.csdn.net/morewindows/article/details/7961256

提供高清PDF电子书下载,方便大家打印。
http://download.csdn.net/detail/morewindows/4560056

版权所有,转载请标明出处:http://blog.csdn.net/morewindows/article/details/7961256。谢谢。



如有疑问,欢迎指出。

...全文
452 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
breakfisher 2012-12-04
  • 打赏
  • 举报
回复
顶楼主,谢谢分享
老王爱上猫 2012-12-04
  • 打赏
  • 举报
回复
看你博客成长的。。。。
MoreWindows 2012-12-04
  • 打赏
  • 举报
回复
呵呵,谢谢支持~
引用 2 楼 mysummer2013 的回复:
帮顶!morewindows大哥好样的!
MoreWindows 2012-12-04
  • 打赏
  • 举报
回复
博客中也有不少STL的文章,欢迎浏览。
引用 4 楼 bjym1987 的回复:
看你博客成长的。。。。
MoreWindows 2012-12-04
  • 打赏
  • 举报
回复
谢谢支持
引用 8 楼 ywj1225 的回复:
顶起,谢谢分享。
MoreWindows 2012-12-04
  • 打赏
  • 举报
回复
谢谢支持
引用 5 楼 breakfisher 的回复:
顶楼主,谢谢分享
彭家老三 2012-12-04
  • 打赏
  • 举报
回复
顶一下,排序。
wjain 2012-12-04
  • 打赏
  • 举报
回复
顶起,谢谢分享。
newtee 2012-12-04
  • 打赏
  • 举报
回复
很好 支持下
qjzl2008 2012-12-04
  • 打赏
  • 举报
回复
最近为啥这么多博客评选
mysummer2013 2012-12-03
  • 打赏
  • 举报
回复
帮顶!morewindows大哥好样的!
MoreWindows 2012-12-03
  • 打赏
  • 举报
回复
第一次发贴,自己先顶下。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧