[LintCode]整數(shù)排序

原文發(fā)表在我的博客:整數(shù)排序
求關(guān)注、求交流、求意見、求建議。

問題

LintCode:整數(shù)排序

描述

給一組整數(shù),按照升序排序,使用選擇排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法。

樣例

對于數(shù)組 [3, 2, 1, 4, 5] , 排序后為:[1, 2, 3, 4, 5] 。

實現(xiàn)

排序是最常見的算法了,但也不是人人都能信手拈來的。toptal 提供了 Sorting Algorithms Animations 幫助人們理解和對比各種排序,每一種排序都有介紹、偽代碼以及不同情況下的動畫演示,在這里向大家推薦。

意識排序

意識排序就是潛意識下寫出來的排序,并沒有一個名字。

class Solution {
public:
    void sortIntegers(vector<int>& A) {
        // 29ms
        int i, j, buffer;
        int size = A.size();
        for (i = 0; i < size; ++i)
            for (j = 0; j < i; ++j) {
                if (A[i] < A[j]) {
                    buffer = A[j];
                    A[j] = A[i];
                    A[i] = buffer;
                }
    }
}

冒泡排序

class Solution {
public:
    void sortIntegers(vector<int>& A) {
        // 33ms
        int i, j, buffer;
        bool swapped = true;
        int size = A.size();
        for (i = 0; i < size && swapped; ++i)
            for (j = size - 1, swapped = false; j > i; --j)
                if (A[j] < A[j - 1]) {
                    buffer = A[j];
                    A[j] = A[j - 1];
                    A[j - 1] = buffer;
                    swapped = true;
                }
    }
}

選擇排序

class Solution {
public:
    void sortIntegers(vector<int>& A) {
        // 28ms
        int i, j, key, buffer;
        int size = A.size();
        for(i = 0; i < size; ++i){
            key = i;
            for(j = i; j < size; ++j) {
                if(A[j] < A[key]) key = j;
            }
            buffer = A[i];
            A[i] = A[key];
            A[key] = buffer;
        }
    }
}

插入排序

class Solution {
public:
    void sortIntegers(vector<int>& A) {
        // 20ms
        int i, j, temp;
        int size = A.size();
        for(i = 1; i < size; ++i) {
            if(A[i] >= A[i - 1]) continue;
            temp = A[i];
            for (j = i - 1; j >= 0 && A[j] > temp; --j){
                A[j + 1] = A[j];
            }
            A[j + 1] = temp;
        }
    }
}

快速排序

class Solution {
public:
    void sortIntegers(vector<int>& A) {
        // 14ms
        Qsort(A, 0, A.size() - 1);
    }
    
    void Qsort(vector<int>& A, int low, int high) {
        if(low >= high) return;
        int begin = low;
        int end = high;
        int temp = A[low];
        while (begin < end) {
            while(A[end] >= temp) --end;
            A[begin] = A[end];
            while(begin < end && A[begin] <= temp) ++begin;
            A[end] = A[begin];
        }
        A[begin] = temp;
        Qsort(A, low, begin - 1);
        Qsort(A, begin + 1, high);
    }
}

總結(jié)

因為是很常見的排序,就沒有寫具體的分析,而且 Sorting Algorithms Animations 上給的很清晰。務(wù)必要打開看一下,非常好的網(wǎng)站。
雖然排序各種標準庫里都有,但是還是要多思考、多了解一點,不僅可以鍛煉一下邏輯能力,還可以在某些特殊情況下有奇效。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 難度:入門 要求: 給一組整數(shù),按照升序排序,使用選擇排序,...
    柒黍閱讀 526評論 0 0
  • 給一組整數(shù),按照升序排序,使用選擇排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法。您在真實的面試中是否遇...
    DayDayUpppppp閱讀 436評論 0 0
  • 題目 Given an integer array, sort it in ascending order. Us...
    六尺帳篷閱讀 285評論 0 2
  • 一、 單項選擇題(共71題) 對n個元素的序列進行冒泡排序時,最少的比較次數(shù)是( )。A. n ...
    貝影閱讀 9,416評論 0 10
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,297評論 0 52

友情鏈接更多精彩內(nèi)容