排序算法

冒泡排序

較大數(shù)字往后浮動(dòng)
循環(huán) N-1 次完成排序
時(shí)間復(fù)雜度 O(n^2)

void bubble_sort(int a[], int n) {
    for (int i = 0; i < n - 1; ++i) {
        for (int j = 0; j < n - i - 1; ++j) {
            if (a[j] > a[j + 1])
                swap(a[j], a[j + 1]);
        }
    }
}

快速排序

隨機(jī)選出一個(gè)中心數(shù)
比這個(gè)數(shù)小的放到左邊颓鲜,大的放右邊
然后對(duì)左邊疾渴、右邊繼續(xù)使用相同操作
時(shí)間復(fù)雜度 O(nlogn)

void qsort(int nums[], int l, int r) {
    if (l < r) {
        int m = l;
        for (int i = l + 1; i <= r; i++) {
            int num = nums[i];
            if (num < nums[l]) {
                swap(nums[++m], nums[i]);
            }
        }
        swap(nums[m], nums[l]);
        
        qsort(nums, l, m - 1);
        qsort(nums, m + 1, r);
    }
}

插入排序

從后往前找一個(gè)合適的位置插入當(dāng)代的數(shù)字
時(shí)間復(fù)雜度O(n^2)

void insert_sort(int a[], int n) {
    // i 控制要插入的元素
    for (int i = 1; i < n; ++i) {
        int current = a[i];
        int j = i;
        while (j - 1 >= 0 && a[j - 1] > current) {
            a[j] = a[j - 1];
            j--;
        }
        a[j] = current;
    }
}

希爾排序

插入排序增強(qiáng)版
先以一定的 gap 進(jìn)行排序魄梯,降低插入排序的復(fù)雜度
時(shí)間復(fù)雜度 O(nlogn)~O(n2)

void shell_sort(int arr[], int len) {
    int gap, i, j;
    int temp;
    for (gap = len >> 1; gap > 0; gap = gap >>= 1)
        for (i = gap; i < len; i++) {
            temp = arr[i];
            for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
                arr[j + gap] = arr[j];
            arr[j + gap] = temp;
        }
}

選擇排序

每次都選取最小值放到前面
時(shí)間復(fù)雜度O(n^2)

void select_sort(int a[], int n) {
    for (int i = 0; i < n; ++i) {
        // 找出最小值
        int pos = i;
        for (int j = i + 1; j < n; ++j) {
            if (a[j] < a[pos]) {
                pos = j;
            }
        }
        swap(a[i], a[pos]);
    }
}

歸并排序

對(duì)已經(jīng)排好序的兩個(gè)部分進(jìn)行歸并操作
排序數(shù)組時(shí)采用遞歸的方法
時(shí)間復(fù)雜度O(nlogn)

void merge(int a[], int l, int mid, int r) {
    int *temp = new int[r - l + 1];
    int p = 0;
    int i = l;
    int j = mid + 1;

    while (i <= mid && j <= r) {
        if (a[i] < a[j])
            temp[p++] = a[i++];
        else 
            temp[p++] = a[j++];
    }

    while (i <= mid)
        temp[p++] = a[i++];

    while (j <= r)
        temp[p++] = a[j++];

    for (int i = 0; i < r - l + 1; ++i)
        a[l + i] = temp[i];

    delete[] temp;
}

void merge_sort(int a[], int l, int r) {
    if (l < r) {
        int mid = l  + (r - l) / 2;
        merge_sort(a, l, mid);
        merge_sort(a, mid + 1, r);
        merge(a, l, mid, r);
    }    
}

堆排序

最大堆實(shí)現(xiàn)從小到大排序
每次從堆頂選出最大元素放到后面
時(shí)間復(fù)雜度 O(nlogn)

void down_heap(int a[], int i, int n) {
    int l = 2 * i + 1;
    int r = 2 * i + 2;

    // 找出最大元素奶浦,和最大的交換
    int largest = i;
    if (l <= n - 1 && a[l] > a[i]) 
        largest = l;
    if (r <= n - 1 && a[r] > a[largest])
        largest = r;

    if (largest != i) {
        swap(a[i], a[largest]);
        // 繼續(xù)下沉
        down_heap(a, largest, n);
    }
}

void build_heap(int a[], int n) {
    // 從最后一個(gè)父節(jié)點(diǎn)開始下沉
    for (int i = (n - 1) / 2; i >= 0; i--) {
        down_heap(a, i, n);
    }
}

void heap_sort(int a[], int n) {
    build_heap(a, n);
    for (int i = n - 1; i > 0; i--) {
        // 取出堆頂放在數(shù)組后
        swap(a[0], a[i]);
        // 新元素下沉
        down_heap(a, 0, --n);
    }
}

計(jì)數(shù)排序

不支持負(fù)數(shù)
時(shí)間復(fù)雜度O(n)
但是非常浪費(fèi)空間

void count_sort(int a[], int n, int MAX) {
    // 計(jì)數(shù)
    int *count = new int[MAX + 1];
    for (int i = 0; i <= MAX; ++i)
        count[i] = 0;
    for (int i = 0; i < n; ++i)
        ++count[a[i]];
    
    // 累計(jì)小于等于i的數(shù)量 
    for (int i = 1; i <= MAX; ++i)
        count[i] += count[i - 1];
    
    int *sort = new int[n];
    for (int i = 0; i < n; ++i) {
        // 可能有重復(fù)的數(shù)字,所以要——
        --count[a[i]];
        sort[count[a[i]]] = a[i];
    }

    for (int i = 0; i < n; ++i)
        a[i] = sort[i];
    
    delete[] count;
    delete[] sort;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淤击,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子故源,更是在濱河造成了極大的恐慌污抬,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绳军,死亡現(xiàn)場(chǎng)離奇詭異印机,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)门驾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門射赛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奶是,你說我怎么就攤上這事楣责。” “怎么了聂沙?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵秆麸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我及汉,道長(zhǎng)沮趣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任坷随,我火速辦了婚禮房铭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘温眉。我一直安慰自己缸匪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布芍殖。 她就那樣靜靜地躺著豪嗽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上龟梦,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天隐锭,我揣著相機(jī)與錄音,去河邊找鬼计贰。 笑死钦睡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的躁倒。 我是一名探鬼主播荞怒,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼秧秉!你這毒婦竟也來了褐桌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤象迎,失蹤者是張志新(化名)和其女友劉穎荧嵌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砾淌,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啦撮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汪厨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赃春。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖劫乱,靈堂內(nèi)的尸體忽然破棺而出织中,到底是詐尸還是另有隱情,我是刑警寧澤要拂,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布抠璃,位于F島的核電站,受9級(jí)特大地震影響脱惰,放射性物質(zhì)發(fā)生泄漏搏嗡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一拉一、第九天 我趴在偏房一處隱蔽的房頂上張望采盒。 院中可真熱鬧,春花似錦蔚润、人聲如沸磅氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烦租。三九已至延赌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叉橱,已是汗流浹背挫以。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窃祝,地道東北人掐松。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像粪小,于是被迫代替她去往敵國(guó)和親大磺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 概述 排序有內(nèi)部排序和外部排序探膊,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序杠愧,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,190評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序突想,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序殴蹄,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評(píng)論 0 15
  • 概述排序有內(nèi)部排序和外部排序猾担,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大刺下,一次不能容納全部的...
    Luc_閱讀 2,278評(píng)論 0 35
  • 該系列文章主要是記錄下自己暑假這段時(shí)間的學(xué)習(xí)筆記绑嘹,暑期也在實(shí)習(xí),抽空學(xué)了很多橘茉,每個(gè)方面的知識(shí)我都會(huì)另起一篇博客去記...
    Yanci516閱讀 12,223評(píng)論 6 19
  • 周幼安 17.03.17 君欲臨川渡水 請(qǐng)務(wù)必抵達(dá)我震蕩的波心 以一枝荻蘆攀援 避讓著莽撞的工腋,無家可歸的水鳥 來我...
    周幼安閱讀 464評(píng)論 5 11