数据结构与算法-排序算法总结

说明

本文参考极客时间—王争·数据结构与算法之美。

个人觉得王争讲得很好,图也很形象。

这里很多字都没有打进来,我觉得配合图片和代码,应该可以了解这个思想了。

如果有需要,大家可以去听一听。

大纲

时间复杂度 稳定排序? 原地排序?
冒泡排序 O(n^2)
插入排序 O(n^2)
选择排序 O(n^2)
快速排序 O(nlogn)
归并排序 O(nlogn)
堆排序 O(nlogn)
桶排序 O(n)
计数排序 O(n+k) k是数据范围
基数排序 O(dn) d是维度

冒泡排序

void bubbleSort(int *a, int n)
{
    if(n <= 1) return;
    for(int i = 0; i < n; i++){
        bool flag = false;   //flag是判断是否无序的标志位
        for(int j = 0; j < n-i-1; j++){
            if( a[j] > a[j+1] ){
                swap( a[j] , a[j+1] );
                flag = true;
            }
        }
        if(!flag) break;
    }
}

图解

第一次冒泡

冒泡过程:

img

插入排序

插入的过程与冒泡的不一样,插入进行的是比较-幅值,冒泡进行的是比较-交换。

因此插入的效率比冒泡要高。

void insertSort(int *a, int n)
{
    if( n <= 1) return;
    for(int i = 1; i < n; i++){
        int value = a[i];   //value是当前待插入的数
        int j = i-1;
        for(;j >= 0; j--){  //j是遍历value前面的数
            if( a[j] > value ){
                a[j+1] = a[j];
            }
        }
        a[j+1] = value;
    }
}

图解

插入过程

选择排序

选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。

图解

选择排序过程

快速排序

快速排序用的是分治思想,因此可以用递归算法来实现。

int partition(int *a, int p, int r)
{
    int pivot = a[r];   //value可以选取得尽量随机
    int i = p;
    for(int j = p; j < r; j++){
        if( a[j] < value ){
            swap( a[i] , a[j] );
            i++;
        }
    }
    swap( a[i] , a[r] );
    return i;
}

void quickSort(int *a, int p, int r)
{
    if( p >= r) return;
    int q;
    q = partition(a,p,r);
    quickSort(a,p,q-1);
    quickSort(a,q+1,r);
}

图解

partition函数过程

归并排序

void merge(int *a, int p, int r, int q)
{
    int *tmp = new int[r-p+1];
    int i = p;
    int j = q + 1;
    int k = 0;
    while( i <= q && j <= r){
        if( a[i] <= a[j])
            tmp[k++] = a[i++];
        else
            tmp[k++] = a[j++];
    }
    int start = j;
    int end = r;
    if(i <= q){
        start = i;
        end = q;
    }
    while( start <= end )
        tmp[k++] = a[start++];
    for(int n = 0; n < r-p+1; n++)
        a[p+n] = tmp[n];
    delete[] tmp;
}

void mergeSort(int *a, int p, int r)
{
    if( p >= r) return;
    int q = (p+r)/2;
    mergeSort(a,p,q);
    mergeSort(a,q+1,r);
    
}

图解

思路
merge函数过程

(持续更新中......)

参考资料

极客时间-王争·数据结构与算法之美https://time.geekbang.org/column/article/0?cid=126

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,565评论 6 525
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,696评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,935评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,327评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,338评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,760评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,085评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,091评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,656评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,657评论 3 348
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,767评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,360评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,088评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,493评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,654评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,374评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,841评论 2 367