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

转载 2013年12月05日 20:05:30
论坛上常常有人问到排序算法,因此对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法进行总结,方便初学者全面的掌握这些基础知识。

一.       冒泡排序
冒泡排序主要思路是:
通过交换使相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复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。谢谢。



如有疑问,欢迎指出。

白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇

在我的博客对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载。下载地址为:http://download.cs...
  • u013445530
  • u013445530
  • 2014年12月10日 16:30
  • 803

白话经典算法系列之六 快速排序 快速搞定

http://blog.csdn.net/morewindows/article/details/6684558 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因...
  • taotaoah
  • taotaoah
  • 2016年03月26日 17:23
  • 983

七大常见排序算法总结

插入类排序 直接插入排序 希尔排序 选择类排序 简单选择排序 堆排序 交换类排序 冒泡排序 快速排序 归并类排序 归并排序...
  • lutianfeiml
  • lutianfeiml
  • 2016年07月19日 19:56
  • 4826

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

在我的博客对冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序和堆排序这七种常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载。下载地址为:http://download.cs...
  • baolinq
  • baolinq
  • 2017年01月11日 21:36
  • 193

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

首先回顾下各种排序的主要思路: 一.       冒泡排序 冒泡排序主要思路是: 通过交换使相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可...
  • wenshao1018
  • wenshao1018
  • 2014年07月01日 06:14
  • 247

【经典排序算法】八大排序对比总结

针对前面讨论的八大经典排序算法:冒泡排序、插入排序、选择排序、堆排序、归并排序、快速排序、希尔排序、桶排序。 关于各种什么时间复杂度,空间复杂度的对比总结,网上一大堆,别人也总结的很好,这里就不赘述了...
  • yeswenqian
  • yeswenqian
  • 2014年04月03日 20:52
  • 1527

十大经典排序算法总结——Java实现

引 这段时间博主逐步替换为Java的实现 //博主留 2017.9.15 //2017.10.10完成冒泡排序的修改 //2017.10.11完成选择排序、插入排序和希尔排序的修改 //2017.1...
  • WangQYoho
  • WangQYoho
  • 2016年09月19日 12:12
  • 2103

排序算法总结与C代码

最近参加笔试,感觉排序算法需要好好的整理一下,感觉部分排序算法理解得不是很清楚;通过这段时间的整理与总结来对排序算法的一个复习吧。         主要参考了《大话数据结构》: 1. 冒泡排序的基本思...
  • yyme411
  • yyme411
  • 2013年10月09日 21:23
  • 7133

排序算法总结及实现(C语言版)

#include using namespace std; void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp;...
  • Mary19920410
  • Mary19920410
  • 2017年03月18日 15:08
  • 1613

几种常见排序算法总结(java版)

代码如下: /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu {...
  • zgrjkflmkyc
  • zgrjkflmkyc
  • 2013年09月13日 12:50
  • 13395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:总结下排序算法——MoreWindows白话经典算法之七大排序总结篇
举报原因:
原因补充:

(最多只允许输入30个字)