`
美丽的小岛
  • 浏览: 308285 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

排序方法比较<转>

阅读更多

根据排序的原则,内排序可以分为:

  • 插入排序
  • 交换排序
  • 选择排序
  • 归并排序

预备知识:

1.等差数列之和:S=n*(a1+an)/2

等比数列之和:S=a1(1-q^n)/(1-q)

2.使用哨兵提高效率

比如基本的顺序查找我们可以这样做:

 

 

 

int search(int a[],int n,int key){

    for(int i=0;i<n;i++)

        if(a[i]==key)

            return i+1;         //返回第几个,而不是返回下标

    return 0;                       //返回0说明没有找到

}

注意到每次for循环都对边界进行检查(i<n),使用哨兵就不需要进行边界检查. 

 

 

int search(int a[],int n,int key){

    a[0]=key;

    for(int i=n;a[i]!=key;i--);

    return i;

}

但是使用哨兵的前提是在数组中a[1]--a[n]存储的是实际的元素,a[0]是拿来做哨兵的,a的长度是n+1.

3.time()返回从197011日到现在的秒数,是实际时间。

clock返回开启进程和调用clock()之间的的CPU时钟计时单元(clock tick)数,不包括显式调用sleep()的时间,常用来测试任务执行的速度。

插入排序

简单插入排序

非常的简单,想想你玩牌的时候一边起牌,一边就把牌排好序了,那就是插入排序.

时间复杂度:O(N^2)1+2+...+(N-1)=N^2/2。这是最坏的情况,其实大致上说插入排序的平均情况和最坏情况一样差。

空间上来讲,任一时刻最多只有一个数字在存储数组之外,属于原地排序,O(1)

稳定的排序.

希尔排序

希尔排序利用利用了插入排序的两个特点:

  • 基本有序时直接插入排序最快
  • 对于数据很少的无序数列,直接插入也很快

谢尔排序的时间复杂度在O(nlogn)O(n^2)之间,空间复杂度为O(1).

为了使集合基本有序,而不是局部有序,不能简单地逐段分割,而应将相距为某个增量的元素组成一个子序列.通常取增量为d1=n/2,di+1=di/2.

交换排序

冒泡排序

把待排序的序列分为有序区和无序区,每次把无序区最大的数放到无序区的最后面,这样无序区的末元素成为有序区的首元素.

时间复杂度为O(n^2),空间复杂度O(1).

 快速排序

快速排序是对冒泡排序的改进,由于冒泡排序是不断比较相邻元素然后进行交换,需要比较移动多次才能到达最终位置.而快速排序的比较和移动是从两端向中间进行,因而元素移动的距离较远.

初始主轴的选取采用三元取中法.经过N趟排序,当元素已基本有序后采用直接插入排序法.

 理想情况下,每次划分左右两侧的序列长度是相同的,长度为n的序列可划分为logn.定位一个元素要对整个序列扫描一遍,所需时间为O(n),总的时间复杂度为O(nlogn).

如果每次都取最左边的元素作主轴,最坏情况下待排序列完全有序(正序或逆序),每次划分只得到比上一次少一个的子序列,总的比较次数为1+2+3+...+(n-1)=O(n^2).

平均来说快速排序的时间复杂度为O(nlogn),栈的深度为O(logn).

快速排序是一种不稳定的排序算法.

选择排序

简单选择排序

简单选择排序和冒泡排序很像,每趟排序把把无序序列中最小的元素放到有序列的最后面,有序序列在前,无序序列在后.但有一个重要的区别:冒泡排序在一趟排序中边比较,边交换;而简单选择排序在一趟排序中只作一次交换.

简单选择排序是稳定的,时间复杂度为O(n^2),空间复杂度为O(1).

堆排序

堆排序是对简单选择排序的改进,在简单选择排序中前一次的比较结果没有保存下来,后一趟排序中反复对以前已经做过的比较重新做了一遍.

时间复杂度为O(nlogn),不稳定的排序.

归并排序

二路归并(用内存太多了,不用了。)

 

总结

 

 

 

 

排序方法

平均情况

最好情况

最坏情况

辅助空间

稳定性

直接插入

O(n^2)

O(n)

O(n^2)

O(1)

希尔

O(nlogn)~O(n^2)

O(n^1.3)

O(n^2)

O(1)

冒泡

O(n^2)

O(n)

O(n^2)

O(1)

快速

O(nlogn)

O(nlogn)

O(n^2)

O(nlogn)~O(n)

简单选择

O(n^2)

O(n^2)

O(n^2)

O(1)

堆排序

O(nlogn)

O(nlogn)

O(nlogn)

O(1)

归并

O(nlogn)

O(nlogn)

O(nlogn)

O(n)

:冒泡排序采用pos来标记已有序的序列位置后,最好情况才是O(n),如果没有采用此改进算法,最好情况也是O(n^2).我们的快速排序每次都把主轴放在vec[0],没用另外使用单独的变量,所以辅助空间为O(1),否则就是O(nlogn)~O(n).

http://www.cnblogs.com/zhangchaoyang/articles/1812997.html

分享到:
评论

相关推荐

    c# List类排序方法

    ### c# List&lt;T&gt;类排序方法 #### 一、初始工作与预备知识 在C#中,`List&lt;T&gt;`是一个非常常用的泛型集合类,它提供了动态数组的功能,可以存储任意数量的相同类型元素。当涉及到对List中的数据进行排序时,我们可以...

    IList排序(C#)

    首先,`IList&lt;T&gt;`接口并没有直接提供排序方法。但是,我们可以通过以下两种方式对实现了`IList&lt;T&gt;`接口的对象进行排序: 1. 使用`Array.Sort()`或`List&lt;T&gt;.Sort()`方法: - `Array.Sort()`:这是静态方法,可以对...

    Android里List时间升序排序

    这是一个通用的方法,可以对任何实现了`Comparable&lt;T&gt;`接口的集合进行排序。在我们的例子中,`String`类已经实现了`Comparable&lt;String&gt;`接口,因此我们可以直接对`List&lt;String&gt;`进行排序。然而,`Collections.sort()...

    C#中的集合示例(Array,ArrayList,Hashtable,List)

    List&lt;T&gt;提供了许多便利的方法,如Add、Remove、Insert、IndexOf等,便于操作和管理列表。 ### 总结 在C#中,选择合适的集合类型取决于具体的需求。Array适用于已知大小且元素类型固定的情况;ArrayList在需要动态...

    C# List用法

    List&lt;T&gt;实现了多个接口,包括IList&lt;T&gt;、ICollection&lt;T&gt;、IEnumerable&lt;T&gt;、IList、ICollection和IEnumerable,从而提供了丰富的功能和方法。 泛型类的优势主要体现在提高了程序的类型安全性和性能。因为List&lt;T&gt;是强...

    C#编程经验技巧宝典

    43&lt;br&gt;&lt;br&gt;0061 树的实现 44&lt;br&gt;&lt;br&gt;3.2 排序 48&lt;br&gt;&lt;br&gt;0062 如何实现选择排序算法 48&lt;br&gt;&lt;br&gt;0063 如何实现冒泡排序算法 49&lt;br&gt;&lt;br&gt;0064 如何实现快速排序算法 50&lt;br&gt;&lt;br&gt;0065 如何实现插入排序算法 ...

    C源代码实例集

    &lt;br&gt;第三部分 数值计算与趣味数学篇&lt;br&gt; &lt;br&gt;075 绘制余弦曲线和直线的迭加&lt;br&gt;076 计算高次方数的尾数 &lt;br&gt;077 打鱼还是晒网 &lt;br&gt;078 怎样存钱以获取最大利息 &lt;br&gt;079 阿姆斯特朗数 &lt;br&gt;080 亲密数 &lt;br&gt;081 自守数 ...

    asp.net技术内幕(1)

    &lt;br&gt;17.3.4 添加缓存键依赖性 &lt;br&gt;17.3.5 建立绝对的过期策略 &lt;br&gt;17.3.6 建立变化的过期策略 &lt;br&gt;17.3.7 设置缓存条目优先级 &lt;br&gt;17.3.8 创建缓存回调方法 &lt;br&gt;17.4 小结 &lt;br&gt;&lt;br&gt;第18章 应用程序跟踪和错误处理 ...

    asp.net技术内幕(2)

    &lt;br&gt;17.3.4 添加缓存键依赖性 &lt;br&gt;17.3.5 建立绝对的过期策略 &lt;br&gt;17.3.6 建立变化的过期策略 &lt;br&gt;17.3.7 设置缓存条目优先级 &lt;br&gt;17.3.8 创建缓存回调方法 &lt;br&gt;17.4 小结 &lt;br&gt;&lt;br&gt;第18章 应用程序跟踪和错误处理 ...

    asp.net技术内幕(5)

    &lt;br&gt;17.3.4 添加缓存键依赖性 &lt;br&gt;17.3.5 建立绝对的过期策略 &lt;br&gt;17.3.6 建立变化的过期策略 &lt;br&gt;17.3.7 设置缓存条目优先级 &lt;br&gt;17.3.8 创建缓存回调方法 &lt;br&gt;17.4 小结 &lt;br&gt;&lt;br&gt;第18章 应用程序跟踪和错误处理 ...

    asp.net技术内幕(4)

    &lt;br&gt;17.3.4 添加缓存键依赖性 &lt;br&gt;17.3.5 建立绝对的过期策略 &lt;br&gt;17.3.6 建立变化的过期策略 &lt;br&gt;17.3.7 设置缓存条目优先级 &lt;br&gt;17.3.8 创建缓存回调方法 &lt;br&gt;17.4 小结 &lt;br&gt;&lt;br&gt;第18章 应用程序跟踪和错误处理 ...

    asp.net技术内幕(3)

    &lt;br&gt;17.3.4 添加缓存键依赖性 &lt;br&gt;17.3.5 建立绝对的过期策略 &lt;br&gt;17.3.6 建立变化的过期策略 &lt;br&gt;17.3.7 设置缓存条目优先级 &lt;br&gt;17.3.8 创建缓存回调方法 &lt;br&gt;17.4 小结 &lt;br&gt;&lt;br&gt;第18章 应用程序跟踪和错误处理 ...

    C#.net_经典编程例子400个

    81&lt;br&gt;实例068 在ListView控件中对数据排序或统计 83&lt;br&gt;实例069 在ListView控件中绘制底纹 84&lt;br&gt;实例070 在列表视图中拖动视图项 85&lt;br&gt;实例071 用ListView控件选取整行数据 88&lt;br&gt;实例072 用ListView...

    程序设计:xml学习指南中文版

    DTD子集 &lt;br&gt;5.5.3 有条件地忽略外部DTD子集&lt;br&gt; 的一部分 &lt;br&gt;5.6 把格式正确的文档转换为有效文档 &lt;br&gt;第6章 定义和使用实体 &lt;br&gt;6.1 实体定义和分类 &lt;br&gt;6.2 声明通用实体 &lt;br&gt;6.2.1 声明内部通用可分析型实体 ...

    LINUX与UNIX SHELL编程指南

    合并与分割 104&lt;br&gt;11.1 sort用法 104&lt;br&gt;11.1.1 概述 104&lt;br&gt;11.1.2 ...方法 108&lt;br&gt;11.1.13 使用k做分类键排序 108&lt;br&gt;11.1.14 指定sort序列 108&lt;br&gt;11.1.15 pos用法 108&lt;br&gt;11.1.16 使用head和tail将输出分类 109...

    MYSQL培训经典教程(共两部分) 1/2

    MYSQL高级特性 81&lt;br&gt;4.1 集合函数 82&lt;br&gt;4.1.1 行列计数 82&lt;br&gt;4.1.2...&lt;br&gt;4.2.5 比较日期和时间 92&lt;br&gt;4.3 字符串模式匹配 93&lt;br&gt;4.3.1 标准的SQL模式匹配 93&lt;br&gt;4.3.2 扩展正则表达式模式匹配 94&lt;br&gt;4.3.3 总结 ...

    MYSQL培训经典教程(共两部分) 2/2

    MYSQL高级特性 81&lt;br&gt;4.1 集合函数 82&lt;br&gt;4.1.1 行列计数 82&lt;br&gt;4.1.2...&lt;br&gt;4.2.5 比较日期和时间 92&lt;br&gt;4.3 字符串模式匹配 93&lt;br&gt;4.3.1 标准的SQL模式匹配 93&lt;br&gt;4.3.2 扩展正则表达式模式匹配 94&lt;br&gt;4.3.3 总结 ...

    LINUX与UNIX_SHELL编程指南1

    合并与分割 104&lt;br&gt;11.1 sort用法 104&lt;br&gt;11.1.1 概述 104&lt;br&gt;11.1.2 ...方法 108&lt;br&gt;11.1.13 使用k做分类键排序 108&lt;br&gt;11.1.14 指定sort序列 108&lt;br&gt;11.1.15 pos用法 108&lt;br&gt;11.1.16 使用head和tail将输出分类 109...

    Java JDK实例宝典

    &lt;br&gt;第1章 Java基础 &lt;br&gt;1.1 转换基本数据类型 &lt;br&gt;1.2 Java的运算符 &lt;br&gt;1.3 控制程序的流程 &lt;br&gt;1.4 计算阶乘 &lt;br&gt;1.5 实现命令行程序 &lt;br&gt;第2章 Java面向对象程序设计 &lt;br&gt;2. 1 复数类 &lt;br&gt;2. 2 equals.chashCode...

    mysql5.1中文手册

    数据和排序用字符集&lt;br&gt;5.10.2. 设置错误消息语言&lt;br&gt;5.10.3. 添加新的字符集&lt;br&gt;5.10.4. 字符定义数组&lt;br&gt;5.10.5. 字符串比较支持&lt;br&gt;5.10.6. 多字节字符支持&lt;br&gt;5.10.7. 字符集问题&lt;br&gt;5.10.8. MySQL服务器时区...

Global site tag (gtag.js) - Google Analytics