排序算法(java)
来源:互联网 发布:千里眼ip扫描软件 编辑:程序博客网 时间:2024/06/06 03:04
花了几天时间总结了一下排序算法,原理基本都是学习维基百科的,http://zh.wikipedia.org/wiki/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95,维基百科确实做的很好,总结的相当完整具体,并且有各种语言的参考代码,给我帮助很大。
以下是我做的总结,各个算法的demo发布在arithmetic分类下的其他文章中,
排序算法:
1、直接插入排序算法
算法描述
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置中
重复步骤2
参考:http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F
2、希尔排序
希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。
将数组列在一个表中并对列排序(用插入排序)。重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身仅仅对原数组进行排序(通过增加索引的步长,例如是用i+= step_size而不是i++)。
假设有这样一组数[ 13 14 94 33 82 25 59 9465 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样:
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10
然后我们对每列进行排序:
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45
当我们以单行来读取数据时我们得到:[ 10 14 73 25 23 13 27 94 33 39 25 5994 65 82 45 ].这时10已经移至正确位置了,然后再以3为步长进行排序:
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45
排序之后变为:
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94
最后以1步长进行排序(此时就是简单的插入排序了)。
参考:http://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F
3、冒泡排序
比较熟悉
4、快速排序
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
步骤为:
从数列中挑出一个元素,称为"基准"(pivot),
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
参考:http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
5、选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
6、堆排序
暂不研究
7、归并排序
算法描述
归并操作的过程如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
归并排序
归并排序具体工作原理如下(假设序列共有n个元素):
将序列每相邻两个数字进行归并操作,形成floor(n /2)个序列,排序后每个序列包含两个元素
将上述序列再次归并,形成floor(n/ 4)个序列,每个序列包含四个元素
重复步骤2,直到所有元素排序完毕
- 排序算法(java)
- 排序算法(java)
- 排序算法(Java)
- Java排序算法(三):堆排序
- Java排序算法(四):冒泡排序
- Java排序算法(五):快速排序
- Java排序算法(九):归并排序
- Java排序算法(三):堆排序
- Java排序算法(四):冒泡排序
- Java排序算法(五):快速排序
- 老生常谈 排序算法(JAVA)-- 归并排序
- #算法排序(Java版)#快速排序
- Java排序算法(三):堆排序
- Java排序算法(四):冒泡排序
- Java排序算法(五):快速排序
- Java排序算法(九):归并排序
- Java排序算法(九):归并排序
- Java排序算法(三):堆排序 .
- flex启动过程和初始化
- 比较Double型数据时的注意事项
- Android IMemory
- 呀呀USB—学习USB HID的好帮手!!
- Git详解之三 Git分支
- 排序算法(java)
- (未完)【C/C++】C++智能指针
- Git详解之四 服务器上的Git
- Ubuntu下python的BeautifulSoup和Mechanize安装方法
- android MP3播放器的一些资料整理
- Visual Studio 2010 Beta1 中的 MPI Cluster Debugger
- Sicily 1031. Campus
- Git详解之五 分布式Git
- IP协议就是个信封