zoukankan      html  css  js  c++  java
  • 排序Tip

    排序算法

     

    所有排序算法汇总: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)
  • 相关阅读:
    数据库基础理解学习-Mysql
    玫瑰花小制作分享-JavaScript(七夕专属浪漫)
    爬虫探索Chromedriver+Selenium初试
    Python 数据结构理解分享
    Python 实用第三方库安装方法
    Python安装-Pycharm+Anaconda
    oracle父子级查询数据树结构
    如何查看class文件的编译jdk版本号
    PL/SQL developer 11.0注册码
    linux 下tomcat出现 Native memory allocation (malloc) failed to allocate 1915224064 bytes for committing reserved memory问题
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3499870.html
Copyright © 2011-2022 走看看