排序算法
排序算法算是很重要的一块内容,今天先做个总览,之后再慢慢更新具体的排序算法。
排序的基本概念
排序就是把一组记录(元素)按照某个域的值的递增或递减的次序重新排列的过程。
若采用的排序方法使排序后记录的相对次序不变(即前面的仍在前面,后面的仍在后面,当然由远邻变为相邻),则称此排序方法是稳定的,否则称为不稳定的。
按照排序过程中所使用的内外存情况不同,可把排序分为内排序和外排序两大类。若排序过程全部在内存中进行,则称为内排序;若排序过程需要不断地进行内存和外存之间的数据交换,并且排序的原始数据和结果都为外存文件,则称为外排序。
按照排序过程中依据的不同原则对内部排序方法进行分类,则可大致分为插入排序、交换排序、选择排序、归并排序和基数排序等五类。
插入排序
主要有直接插入排序和希尔排序。
直接插入排序可以想象成整理扑克牌的过程。
其中希尔排序可理解为间隔变化的插入排序,并且间隔是逐渐缩小的。
其他插入排序包括折半插入排序、二路插入排序、表插入排序。
本博客内链接:
直接插入排序:http://www.cnblogs.com/mengdd/archive/2012/11/24/2786490.html
希尔排序:http://www.cnblogs.com/mengdd/archive/2012/11/25/2787870.html
交换排序
交换排序包括冒泡排序和快速排序。
冒泡排序的基本思想是总是交换相邻的两个元素的顺序,这样关键字较小的记录就会像水中的气泡一样逐趟向上漂浮,而关键字较大的记录就好像石块一样往下沉。
快速排序是对冒泡排序的一种改进,它的基本思想是,通过一趟排序将待排记录分成两部分,其中一部分记录的关键字均比另一部分的关键字小,则可对这两部分再分别进行排序。
本博客内链接:
冒泡排序:http://www.cnblogs.com/mengdd/archive/2012/11/26/2789710.html
快速排序:http://www.cnblogs.com/mengdd/archive/2012/11/26/2790022.html
选择排序
选择排序包括简单选择排序和树形选择排序、堆排序等。
本博客内链接:
简单选择排序和树形选择排序:http://www.cnblogs.com/mengdd/archive/2012/11/27/2791412.html
归并排序
归并的含义是将两个或两个以上的有序表组合成一个新的有序表。
比如2-路归并排序就是通过不断的两两归并(每次的序列都比上次的大),经过很多趟之后,得到最后的有序序列。
基数排序
基数排序(Radix Sorting)是和前面各类排序方法完全不相同的一种排序方法。实现基数排序不需要进行关键字的比较,基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。
一些比较好的资料
可视化排序:http://coolshell.cn/articles/3933.html
(可以把规模变大体会一下算法效率)
排序算法比较:http://coolshell.cn/articles/399.html
可视化的数据结构和算法:http://www.cs.usfca.edu/~galles/visualization/Algorithms.html
算法和数据结构的字典:http://xlinux.nist.gov/dads/
还有这个排序算法集锦:http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html
(看了这个才知道原来有这么多各种各样的排序算法)
白话算法系列:http://www.cnblogs.com/morewindows/category/314533.html