排序算法

 

所有排序算法汇总:http://en.wikipedia.org/wiki/Sort_algorithm

counting sort 资料 :http://www.cs.miami.edu/~burt/learning/Csc517.091/workbook/countingsort.html

基数排序(radix sort) 资料:http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/RadixSort.htm


排序算法可以根据不同的特性划分为不同的类别,这些特性有:   + 是否是 comparison-based   + 时间复杂度: O(nlogn) 级别还是 O(n^2)级别   + 空间复杂度   + 是否 stable, 即维持原有相对顺序   + 是否 adaptive, 即算法时间是否与输入序列的有序性相关   + ...


comparison-based 排序算法

  1. 插入排序(Insertion Sort) - O(n^2) 算法描述: 给定一个序列, 假设当前处理位置 p, p 之前的子序列是已经被排序的, 那么当前只要把 data[p] 插入到 data[1~p-1] 合适的位置, 先比较 p 和 p-1, 如有必要, 再和 p-2 比较. 时间: 平均 O(n^2) 的, 最好 O(n) -- 输入序列已排序, 最差 O(n^2) -- 输入序列逆序. 空间: O(1). stable: 根据算法描述不难得知它是 stable 的. online: 该算法也是在线的, 对于输入流中新入的每一个数字 d, 只要将 d 插入到已有的排序序列中即可.
  2. 选择排序(Selection Sort) - O(n^2) 算法描述: 给定一个序列, 每次扫描未排序的部分, 选出最小的元素, 将它写入已经排序的部分.  时间: O(n^2), 不管输入序列是否有序, 该算法都需要 O(n^2) 次比较. 空间: O(1).  stable: 算法会交换当前值和最小值, 这会破坏序列的稳定性. online: 易知算法做不到在线, 因为假如新入的数字是最小的, 算法不能将它插入到序列的首位.
  3. 冒泡排序(Bubble Sort)  - O(n^2) 算法描述:  给定一个序列, 每次都从首位开始 "冒泡", 比较并交换(如必要)相邻的两个元素, 直到当前的结尾. 每一轮冒泡都将当前的最大值放到当前的结尾.  时间: 平均 O(n^2), 最好 O(n) -- 输入序列已排序, 最差 O(n^2) -- 输入序列逆序. 空间: O(1). stable: 是的. online: 可以想象该算法不适合在线. 备注: 该算法实际中效果较差, 但有一点值得借鉴, 便是判断序列是否已排序 -- 扫描序列, 确认没有逆序对.
  4. 希尔排序(Shell Sort)  - O(n(logn)^2) / O(n^3/2) 算法描述: 有一个间隔序列, 排序 data[i], data[i+gap]  子序列, 当排序最后间隔为 1 的子序列之后, 原始序列便被排序. 时间: 平均 O(n(logn)^2) 或 O(n^3/2), 最好 O(n), 最坏 O(n^2) -- 该算法时间复杂度的证明很复杂. 空间: O(1). stable: 不是. online: 显然不是.
  5. 堆排序(Heap Sort)  - O(nlogn) 算法描述: 利用最大堆的思想来排序. 时间: 该算法的优点是有稳定的运行时间 O(nlogn). 空间: O(1) , 如在数组实现中, 利用数组末尾存储已排序的数字. stable: 不是. online:
  6. 归并排序(Merge Sort) - O(nlogn) 算法描述: 将输入序列递归地划分为子序列, 长度为 1 的子序列被认为是已排序的, 然后合并已排序的子序列. 时间: O(nlogn). 空间: 最坏的情况是 O(n). 备注: 该算法有两种实现方式, top-down 和  bottom-up.
  7. 快速排序(Qcuik Sort) - O(nlogn) 算法描述: 对于给定序列, 选取一个 pivot, 将大于该 pivot 的放在其右侧, 小于等于的放于 pivot 左侧. 递归地处理左右侧的子序列. 时间: O(nlogn), 最坏情况 O(n^2). 空间:   stable: online: 备注:

不是 comparison-based 的排序算法

  1. 计数排序(counting sort)
  2. 桶排序(bucket sort)
  3. 基数排序(radix sort)

排序Tip的更多相关文章

  1. Java程序性能优化Tip

    本博客是阅读<java time and space performance tips>这本小书后整理的读书笔记性质博客,增加了几个测试代码,代码可以在此下载:java时空间性能优化测试代 ...

  2. C# List.sort排序详解(多权重,升序降序)

    很多人可能喜欢Linq的orderBy排序,可惜U3D里面linq在Ios上会报错,所以就必须使用list的排序. 其实理解了并不难 升序降序比较 sort有三种结果 1,-1,0分别是大,小,相等. ...

  3. arts打卡 从排序数组中删除重复项

    Algorithm 从排序数组中删除重复项     给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组 ...

  4. Java Map 按Key排序和按Value排序【转】【补】

    package kingtool.sort; import java.util.ArrayList; import java.util.Collections; import java.util.Co ...

  5. 排序与相关性(Sorting and Relevance)

    本文翻译自Elasticsearch官方指南的Sorting and Relevance一章的第一节. 原文地址:http://www.elastic.co/guide/en/elasticsearc ...

  6. 八大排序算法的python实现(三)冒泡排序

    代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L = [1, 3, 2, 32, 5, 4] def Bubble_sort(L): for i in range( ...

  7. C# List.sort排序(多权重,升序降序)

    很多人可能喜欢Linq的orderBy排序,可惜U3D里面linq在Ios上会报错,所以就必须使用list的排序. 其实理解了并不难 升序降序比较 sort有三种结果 1,-1,0分别是大,小,相等. ...

  8. 利用C语言将混乱数字排序(即冒泡排序法)(含思路)

    大一C语言 你没学过吗 这篇可以称的上入门级别的c语言了 当然还有水仙花数,冒泡排序等经典的C语言程序 后面也会逐一更新 尽情期待喔~~~ 冒泡排序法的基本思路为:每次将相邻的两个数比较,将小的调在前 ...

  9. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

随机推荐

  1. 跨域的小小总结:js跨域及跨域的几种解决方法

    一.什么是跨域?? js跨域请求就是使用js访问iframe里的不同域名下的页面内容,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同的域的iframe框架中的数据.即只要域名.协议. ...

  2. 【转】Objective-C中的instancetype和id关键字

    原文:http://blog.csdn.net/wzzvictory/article/details/16994913 一.什么是instancetype instancetype是clang 3.5 ...

  3. UITableView中容易忽略的知识点

    1.取消余下的分割线 tableView.tableFooterView = UIView() 2.分割线顶格 override func viewDidLayoutSubviews() { self ...

  4. Oracle 日期类型timestamp(时间戳)和date类型使用

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  5. HDU1557权利选举

    /* 思路:遍历所有2^n个集合,对于每个集合求票和,如果满足票为优胜团体,而再对集合每个成员比较,是否满足变成非优胜团体,是的话,对于该成员对应结果+1. 重点:利用二进制思想,所有团体均对应0~2 ...

  6. 朋友的礼物(英雄会,csdn,高校俱乐部)信封问题,匹配模型

    前言: 首先这是一题解,但是重点最代码之后,有耐心的可以直接从代码后看. 上题目:n个人,每个人都有一件礼物想送给他人,他们决定把礼物混在一起,然后每个人随机拿走一件,问恰好有m个人拿到的礼物恰好是自 ...

  7. free() 是如何释放不同内存区块大小的指针?

    最初是在知乎上看到这个问题的C++ delete[] 是如何知道数组大小的?,我也挺好奇,所以就作了一番工作. 申请内存时,指针所指向区块的大小这一信息,其实就记录在该指针的周围看下面这段代码: #i ...

  8. Codeforces 553C Love Triangles(图论)

    Solution: 比较好的图论的题. 要做这一题,首先要分析love关系和hate关系中,love关系具有传递性.更关键的一点,hate关系是不能成奇环的. 看到没有奇环很自然想到二分图的特性. 那 ...

  9. tp接支付宝接口签名不相等解决办法 接口版本3.3 tp版本3.1

    (2)在Core.php和Notify.php文件中添加了去掉TP的URL中的'_URL_'参数的函数.这个是必须的,否则会导致验证失败问题.具体改变为: function paraFilter改为 ...

  10. red bottom shoes featured

    最近做了一个红底高根鞋的电商网站 Cheap Red Bottom Shoes Christian Louboutin Loafers Bestsellers Christian Louboutin ...