八大排序算法总结

概述

在排序过程中,根据数据元素是否完全在内存中,可将排序算法分为两类:内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里只讨论内部排序。

各种排序算法的关系可由下图描述(出处http://blog.csdn.net/hguisu/article/details/7776068),由此我们可以把内部排序算法分为8种。

理解这些算法的最好方式就是举个例子,然后按照算法手动操作。

八大排序算法总结_第1张图片

1.直接插入排序算法


2.希尔排序


3.简单选择排序


4.堆排序

八大排序算法总结_第2张图片

以建立大根堆的算法为基础,我们可以写出堆排序算法


同时,堆也支持插入和删除的操作

八大排序算法总结_第3张图片

5.冒泡排序

八大排序算法总结_第4张图片

6.快速排序

八大排序算法总结_第5张图片

从上面的代码中我们不难发现快速排序算法的关键在于划分操作,同时快速排序算法的性能也主要取决于划分操作的好坏。

快速排序的分治(partition)过程有两种方法。

1)两个下标分别从首尾向中间扫面的方法

假设每次总是以当前表中第一个元素为枢轴值(基准)对表进行划分,则必须将表中比枢轴值大的元素向右移动,比枢轴值小的元素向左移动,使得一趟Partition()之后,

表中的元素被枢轴值一分为二。

八大排序算法总结_第6张图片

2)两个指针索引一前一后逐步向后扫描的方法

这种方法有一个特点,即一次划分之后,枢轴值左边的元素相对顺序不变,即这些元素保持在初始序列中的相对顺序,某些应用要求序列的一部分保持相对顺序,

这时可以考虑此种划分操作。

八大排序算法总结_第7张图片

7.归并排序(二路归并)

递归形式的二路归并排序算法是基于分治的,其过程如下:

分解:将含有n个元素的待排序表分成各含n/2个元素的子表,采用二路归并排序算法对两个子表递归地进行排序。

合并:合并两个已排序的子表得到的排序结果。代码如下:


Merge()的功能是将前后相邻的两个有序表归并成一个有序表的算法。

这两段有序表A[low...mid]、A[mid+1...high] 放在同一顺序表中的相邻位置上,先将它们复制到辅助数组B中。每次从对应B中的两个段取出一个记录进行关键字的比较,将

较小者放入A中,当数组B中有一段比较完成时,将另一段中的剩余部分直接复制到A中。算法如下:

八大排序算法总结_第8张图片

8.基数排序(出处http://www.cnblogs.com/jingmoxukong/p/4311237.html)

八大排序算法总结_第9张图片

八大排序算法总结_第10张图片

八大排序算法总结_第11张图片

八大排序算法总结_第12张图片

八大排序算法总结_第13张图片














你可能感兴趣的:(八大排序算法总结)