• 排序算法大总结



    好的我们先来看下排序算法的大结构



    1.
    交换排序法    
    冒泡排序 | 鸡尾酒排序 | 奇偶排序 | 梳排序 | 侏儒排序 | 快速排序 |臭皮匠算法 | Bogo排序
    2.
    选择排序法    
    选择排序 | 堆排序 | Smooth排序 | 笛卡尔树排序 | 锦标赛排序 | 循环排序
    3.
    插入排序法    
    插入排序 | 希尔排序 | 二叉查找树排序 | 图书馆排序 | Patience排序
    4.
    归并排序法    
    归并排序 | 多相归并排序 | Strand排序
    5.
    分布排序法    
    美国旗帜排序 | 珠排序 | 桶排序 | 爆炸排序 | 计数排序 | 鸽巢排序 | 相邻图排序 | 基数排序 | 闪电排序
    6.
    混合排序法    
    Tim
    排序 | 内省排序 | Spread排序 | 反移排序 | J排序
    其他    
    双调排序器 | Batcher归并网络 | 两两排序网络


    我们来看下网易的一道排序算法题:


    1. (单选)最坏情况下时间复杂度不是n(n-1)/2的排序算法是:
          A.
      快速排序 B.冒泡排序 C.直接插入排序 D.堆排序



    排序算法的考点主要倾向于稳定性,跟算法时间复杂度的计算。

    ps:说到算法时间复杂度,很多人连时间复杂度都不懂,这样的程序员一抓一大把,他们也有自己的理由,现在硬件是这么强悍。。。)







    我们这次教程不面向初学者,只对有经验的程序。


    一。插入排序

    直接插入排序


    很多学直接插入排序的人来说,插入排序我觉得关键是哨兵的作用。


    也就是那第一个临时变量。



    我们来看下直接插入排序的代码:

    #include <iostream>

    #include <regex>

    using namespace std;

    const int len = 8;

    /*

    * 插入排序

    */

    void sortinsert(int r[])

    {

    int j = 0;

    for(int i=2;i<len;i++)

    {

    if(r[i]<r[i-1])

    {

    r[0] = r[i]; //设置哨兵

    for( j=i-1;r[j]>r[0];j--)

    {

    r[j+1] = r[j];

    }

    r[j+1] = r[0];

    }

    }

    }

    int main()

    {

    //0 1 2 3 4

    int a[] = {0,5,3,6,1,2,7,4};

    sortinsert(a);

    for(int i=1;i<len;i++)

    {

    cout<<a[i]<<endl;

    }

    return 0;

    }




    插入排序的时间复杂度是多少?最坏情况是多少? 最好情况士多少?0他是稳定的多少?



    如果你不能直接想出来,那说明,你并没有理解这个算法



  • 相关阅读:
    Luogu P3703 [SDOI2017]树点涂色
    好吧,又建了一个博客
    JDI tutorial (trace example)
    【译文】Java Logging
    openjdk 完全编译指南
    入门: 使用JNI 从C++代码中调用Java的静态方法
    使用JVMTI创建调试和监控代理
    【译文】 GC 安全点 和安全区域
    Java虚拟机 safepoints 初探
    NoClassDefFoundError vs ClassNotFoundException
  • 原文地址:https://www.cnblogs.com/pipicfan/p/2698615.html
Copyright © 2020-2023  润新知