zoukankan      html  css  js  c++  java
  • 各种排序算法

    稳定的

      1,冒泡排序(bubble sort) — O(n^2)

        每次扫描的时候,看看第k位是不是比k-1的小,如果小,就调换位置,循环n次,算法复杂度是O(n2)

      2,鸡尾酒排序(Cocktail sort, 双向的冒泡排序) — O(n^2),

        有时降序冒泡,有时升序冒泡

      3,插入排序(insertion sort)— O(n^2)

        从头开始扫描,已经扫描的就是排好序的,未扫描的就是未排序的,总共扫描n次,每次插入的时候移动n次,时间复杂度O(n2)

      4,桶排序(bucket sort)— O(n); 需要 O(k) 额外空间

        将数的范围1-m分成k等分,然后把n个数分到这个k等分中,然后再对每个等分的数排序,最后合并这k等分

      5,合并排序(merge sort)— O(nlog n); 需要 O(n) 额外空间

        对排序的数两两排序,然后再四个四个排序,然后再八个八个排序....算法复杂度是O(nlog(n))

    不稳定的

      1,选择排序(selection sort)— O(n^2)

        扫描n次,从中选择最小的,挑出来,总共循环n次,算法复杂度也是O(n2)

        这种排序方法可能一看认为是稳定的,想一个反例:5 8 5 2 9,从小到大排序,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法

      2,希尔排序(shell sort)— O(nlog n) 如果使用最佳的现在版本

        维护一个类似增量的变量k,一开始k是大于n/2的最小整数,将i和i+k元素比较,这里需要注意的是,如果第i和i+k位置互换之后,还需要比较i位置上的新数和i-k位置上的需不需要互换,扫描完之后,k变为k/2,然后重新扫描,算法复杂度

      3,堆排序(heapsort)— O(nlog n)

        构建初始堆:每次调整都是从父节点、左孩子节点、右孩子节点三者中选择最大者跟父节点进行交换(交换之后可能造成被交换的孩子节点不满足堆的性质,因此每次交换之后要重新对被交换的孩子节点进行调整

        然后不停从堆顶得到最大最小值就可以了

      4,快速排序(quicksort)— O(nlog n) 期望时间, O(n^2) 最坏情况; 对于大的、乱数列表一般相信是最快的已知排序

  • 相关阅读:
    Solution SQL Server 2008 Configuration Manager Cannot open problem.
    Grant, Revoke, Deny
    Solution: 无法察看SQL Server 数据库属性 错误: "There is no row at position 0. (System.Data)"
    SQL SMO 学习
    恢复误删的桌面 回收站
    SQL Server Security Understanding.
    SQL Server 中的 Schema, User, Login, Role
    形而上学 辩证法
    文档归档的配置发送
    无法从服务器加载工作流操作
  • 原文地址:https://www.cnblogs.com/zhongwh/p/2399936.html
Copyright © 2011-2022 走看看