常用排序算法总结
原文地址(包括下面排序的代码)
http://www.cnblogs.com/Peter-Zhang/archive/2011/08/28/2155571.html
错误之处,请指正
ps: 很久没有逛csdn, 刚刚从测试转开发, 忙,适应中...
常见排序算法主要有:冒泡排序,选择排序,插入排序,归并排序,希尔排序,堆排序,快速排序,计数排序,基数排序,桶排序。
1. 冒泡排序(Bubble sort)
依次比较相邻的两个数,将小数放在前面,大数放在后面。
2. 选择排序(Selection sort)
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
3. 插入排序(Insertion sort)
将n个元素的数列分为已有序和无序两个部分,每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,
找出插入位置,将该元素插入到有序数列的合适位置中。
4. 归并排序(Merge sort)
将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
排序过程如下:
1) 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2) 设定两个指针,最初位置分别为两个已经排序序列的起始位置
3) 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4) 重复步骤3直到某一指针达到序列尾
5) 将另一序列剩下的所有元素直接复制到合并序列尾
5. 希尔排序(Shell sort)
希尔排序插入排序的一种,是针对直接插入排序算法的改进,该方法又称缩小增量排序。
排序过程如下:
1) 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。
2) 在各组内进行直接插入排序;
3) 取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
6. 堆排序(Heap sort)
堆积排序是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。
排序过程如下:
1) 建立一个堆H[0..n-1]
2) 把堆首(最大值)和堆尾互换
3) 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置
4) 重复步骤2,直到堆的尺寸为1
7. 快速排序(Quick sort)
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据
分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
排序过程如下:
1) 设置两个变量i、j,排序开始的时候:i=0,j=n-1
2) 以第一个数组元素作为关键数据,赋值给key,即 key=A[0]
3) 从J开始向前搜索,即由后开始向前搜索(j=j-1),找到第一个小于key的值A[j],并与A[i]交换
4) 从i开始向后搜索,即由前开始向后搜索(i=i+1),找到第一个大于key的A[i],与A[j]交换
5) 重复第3、4、5步,直到 i=j;(3,4步是在程序中没找到时候j=j-1,i=i+1,直至找到为止。找到并交换的时候i,j指针位置不变。另外当i=j这过程一定正好是i+或j-完成的最后另循环结束。)
8. 计数排序(Counting sort)
计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。
当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 O(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。
排序过程如下:
1) 找出待排序的数组中最大和最小的元素
2) 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
3) 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
4) 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
9. 基数排序(Radix sort)
一种整数排序算法,原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,
而MSD则相反,由键值的最左边开始。
排序过程: