几种内部排序-分类-复杂性-稳定性

1. 简述

本文主要说明一些常用的内部排序算法的分类、复杂性和稳定性。主要基于现在的理解和学习,详细准确的复杂度可以参见维基百科等比较权威的网站,对于一些算法的不同实现,复杂度也不同,这里给出的复杂度都是相对较好的算法的复杂度。

2. 分类
   

3. 复杂性和稳定性

冒泡排序:在已经有序的情况,取得O(N)的复杂度。
    快速排序:每次递归都是N的复杂度,递归次数根据序列有关系,当已经有序的情况下,递归N次,时间复杂度为O(N*LogN)
    插入排序:在已经有序的情况,取得O(N)的复杂度。
    希尔排序:最差时间和平均时间都要根据步长数组来判断,现在最好算法的最差时间复杂度,为O(N*LogN)。空间主要是步长数组需要的。一般步长之间不要存在公因子。
    插入排序:交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。
    堆排序:  堆排序属于选择排序,选择N-1次,每次从堆中选择一个,因此最差就是N*LogN。最好的时间无法准确估计,基本上也是N*LogN这个程度。
    归并排序:这个排序算法的复杂度与数组初始化序列无关,归并次数为LogN次,每次复杂度是O(N),因此复杂度都是O(N*LogN)
    基数排序:K是数组中,数值的最大位数。对于int来说,使用十进制的话,K<=10。稳定性来说,基数排序要求每次必须使用稳定排序,否则最终得不到正确结果。所以这里的稳定是必须的,而不可能存在不稳定的。而其他的排序,比如冒泡排序,可以改写成不稳定的,这点需要注意。
    计数排序:K是数组中,数值的范围,即K=Max-Min+1。对于int来说,最坏的情况为K=2^32,即数组内包含了最大正数和最小负数。
    桶排序:由于桶排序可能有的桶没有数据,那么假设N个数据,只被分到了M个桶中,O(N)+O(M*(N/M)*log(N/M))=O(N+N*(logN-logM))=O(N+N*logN-N*logM) =O(N+N*(logN-logM)),当分到的桶越多时,越是接近N。计数排序可以看作桶排序的一个特例,将桶开的很大,直到能够保证每个不同的数值都被分到一个桶中。

4. 参考

维基百科
    三种线性排序算法 计数排序、桶排序与基数排序    http://www.byvoid.com/blog/sort-radix/
    桶排序与基排序    http://anwj336.blog.163.com/blog/static/8941520920109535025216/

标签: ALGORITHM

时间: 2024-12-21 21:17:02

几种内部排序-分类-复杂性-稳定性的相关文章

常见的9种内部排序(C语言实现)

现在已经把常见的9种内部排序算法都用C语言实现了,为了方便自己和大家查看,就弄了这么一个类似于导航目录的东西. 一.冒泡排序 冒泡排序(C语言版) 二.选择排序 选择排序(C语言版) 三.直接插入排序 直接插入排序(C语言版) 四.希尔排序 希尔排序(C语言版) 五.归并排序 归并排序(C语言版) 六.基数排序 基数排序(C语言版) 七.快速排序 快速排序(C语言版) 八.计数排序 计数排序(C语言版) 九.堆排序 堆排序(C语言版) 介绍完这九个常用的排序算法,怎么能没有一个比较呢?下面是我对

内部排序算法的稳定性

1.排序 排序是计算机程序设计中的一个重要操作,因此学习和研究各种排序算法是一个重要的课题. 2.排序种类 根据排序记录的数量和排序过程中的存储器不同,可以将排序分为内部排序和外部排序. 内部排序:指的是将带排序记录存放到计算机内存中进行排序的过程. 外部排序:指的是带排序的记录数量很大,以至于内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程. 3.排序稳定性 关于排序的稳定性:如果排序前2个相等的数在序列的前后位置顺序和排序后它们两个的前后位置顺序相同,就是稳定的排序,否则就

数据结构6种内部排序算法的比较

1.需求分析 (1)输入数据的形式为:伪随机数产生程序产生,且每次输入数不少于100个,至少要用5组不同的输入数据 (2)输出的形式为:输出关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)的数据 (3)程序能达到的功能:对起泡排序,直接插入排序,简单选择排序,快速排序,希尔排序,堆排序这6种常用的内部排序算法进行比较,比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动) (4)测试数据:正确输入为由伪随机数产生程序产生100个随机数,然后输出比较结果,错

七种机器内部排序的原理与C语言实现,并计算它们的比较次数与移动次数。

内部排序是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 排序是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列.排序分为两类:内排序和外排序. 其中快速排序的是目前排序方法中被认为是最好的方法. 内部排序方法: 1.插入排序(直接插入排序): 2.快速排序: 3.选择排序(简单选择排序): 4.归并排序: 5.冒泡排序: 6.希尔排序(希尔排序是对直接插入排序方法的改进): 7.堆排序: ——摘自百度百科 #ifnd

七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)

 写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.因此排序掌握各种排序算法非常重要.对下面介绍的各个排序,我们假定所有排序的关键字都是整数.对传入函数的参数默认是已经检查好了的.只是简单的描述各个算法并给出了具体实现代码,并未做其他深究探讨. 基础知识: 由于待排序的记录数量不同,使得排序过程中设计的存储器不同,可将排序方法分为两大类:一类是内部排序,指的是待排序记录存放在计算机随机存储器中进行的排序过程.另一类是外部排序,

王道数据结构内部排序算法总结

首先看一下内部排序分类以及各个算法的时间复杂度.空间复杂度和稳定性 一.插入排序 1.直接插入排序 (Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表.开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程. 代码: 方法一: void InsertSort(ElemType A[],int n) { int i,j;

内部排序-第10章-《数据结构题集》习题解析-严蔚敏吴伟民版

//**留坑待填**// 一.基础知识题 10.1?以关键码序列(503,087,512,061,908,170,897,275,653,426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态: (1)直接插入排序:                            (2)希尔排序(增量d[1]=5): (3)快速排序:                                  (4)堆排序: (5)归并排序:                              

内部排序

几种内部排序的实现 void SelectSort(int *a,int n) { for (int i = 0; i < n - 1; i++) { int flag = -1; for (int j = i + 1; j < n; j++) { if (a[i] > a[j]) { flag = j; } } if (flag != -1) { int temp = a[i]; a[i] = a[flag]; a[flag] = temp; } } } void InsertSort

内部排序-&gt;基数排序-&gt;链式基数排序

文字描述 基数排序是和前面各类排序方法完全不相同,前面几篇文章介绍的排序算法的实现主要是通过关键字间的比较和移动记录这两种操作,而实现基数排序不需要进行记录关键字间的比较.基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法.先介绍下什么是多关键字排序,以引入链式基数排序算法. 先介绍什么是多关键字排序: 比如,对扑克牌进行排序,每张扑克牌有两个"关键字":花色(梅花<方块<红桃<黑桃)和面值(2<3<,-,A),且"花色"