排序算法(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,直到所有元素排序完毕

 


原创粉丝点击