排序

  • 冒泡排序 時間復(fù)雜度 O(n2),空間復(fù)雜度 O(1)
  • 選擇排序 時間復(fù)雜度 O(n2)癌压,空間復(fù)雜度 O(1)
  • 插入排序 時間復(fù)雜度 O(n2)仰泻,空間復(fù)雜度 O(1)
  • 希爾排序 時間復(fù)雜度 O(nlogn),空間復(fù)雜度 O(1)
  • 歸并排序 時間復(fù)雜度 O(nlogn)措拇,空間復(fù)雜度 O(n)
  • 快速排序 時間復(fù)雜度 O(nlogn)我纪,空間復(fù)雜度 O(logn)
  • 堆排序
  • 計數(shù)排序
  • 桶排序
  • 基數(shù)排序

冒泡排序
兩兩比較元素,使值較小的元素不斷前移丐吓,值較大的元素不斷后移浅悉,每次循環(huán)都能找出當(dāng)前區(qū)間中值最大的元素,且循環(huán)結(jié)束時值最大的元素位于當(dāng)前區(qū)間的最右端券犁。

public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            /*循環(huán)區(qū)間[0, len-i)*/
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j] > array[j+1]) {
                    int temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
    }
冒泡排序

選擇排序
兩兩比較元素术健,找出當(dāng)前區(qū)間中值最小的元素,將該元素和當(dāng)前區(qū)間頭部元素互換粘衬,以此類推荞估,直到所有元素均排序完畢。

public static void selectionSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            int index = i;
            /*當(dāng)前區(qū)間[i, len)*/
            for (int j = i; j < array.length; j++) {
                if (array[j] < array[index]) {
                    index = j;
                }
            }
            /*將當(dāng)前區(qū)間中最小元素和區(qū)間頭部元素互換*/
            int temp = array[i];
            array[i] = array[index];
            array[index] = temp;
        }
    }
選擇排序

插入排序
在原數(shù)組上構(gòu)建一個有序序列稚新,初始時將a[0]視為有序序列勘伺,對于a[i],從右到左掃描區(qū)間[o, i)褂删,找到a[i]合適的插入位置飞醉,然后將區(qū)間[o, i)中大于a[i]的元素都后移一位,最后將a[i]插入到區(qū)間中屯阀,以此類推缅帘,直到所有元素均排序完畢。

public static void insertionSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int current = array[i], j;
            /*若current<array[j], 則array[j]后移一位*/
            for (j = i-1; j >= 0; j--) {
                if (current < array[j]) {
                    array[j+1] = array[j];
                } else {
                    break;
                }
            }
            array[j+1] = current;
        }
    }
插入排序

希爾排序
希爾排序是插入排序的改進(jìn)算法难衰,不同點(diǎn)在于希爾排序會優(yōu)先比較距離較遠(yuǎn)的元素钦无。希爾排序也叫縮小增量排序,首先需要確定增量和縮小增量的模式盖袭,一般采用增量gap = length / 2失暂,縮小增量gap = gap / 2彼宠,從而得到增量序列{n/2, (n/2)/2 … 1}。增量序列的長度k表示算法需要對數(shù)組進(jìn)行排序的次數(shù)趣席,增量值gap表示每次排序需將數(shù)組劃分成gap組兵志,分組提取元素時的步長為gap,對于每個分組宣肚,按照插入排序的方式進(jìn)行處理想罕。

public static void ShellSort(int[] array) {
        /*確定增量*/
        int gap = array.length / 2;
        while (gap > 0) {
            /*分成gap組, 當(dāng)前指向分組中第二個元素*/
            for (int i = gap; i < array.length; i++) {
                int current = array[i], j;
                /*若current<array[j], 則array[j]后移一位*/
                for (j = i-gap; j >= 0; j = j-gap) {
                    if (current < array[j]) {
                        array[j+gap] = array[j];
                    } else {
                        break;
                    }
                }
                array[j+gap] = current;
            }
            /*確定縮小增量*/
            gap /= 2;
        }
    }
希爾排序

歸并排序
分治法)以二路歸并排序?yàn)槔紫葘?dāng)前數(shù)組分成兩個子串,遞歸分割子串,直到每個子串中只包含一個元素娶聘,這時可以認(rèn)為子串內(nèi)部是有序的众弓,然后將子串兩兩合并客税,使子串間有序,不斷合并有序的子串,最終得到一個有序的數(shù)組。

public static int[] MergeSort(int[] array) {
        /*遞歸終止條件*/
        if (array.length < 2) {
            return array;
        }
        int mid = array.length / 2;
        /*2-路歸并, 將array分成兩段*/
        int[] left = Arrays.copyOfRange(array, 0, mid);
        int[] right = Arrays.copyOfRange(array, mid, array.length);
        /*使兩個子段內(nèi)部有序*/
        /*合并內(nèi)部有序的子串, 使整體有序*/
        return merge(MergeSort(left), MergeSort(right));
    }

    /**
     * 將兩段排序好的數(shù)組結(jié)合成一個排序數(shù)組
     * @param left
     * @param right
     */
    public static int[] merge(int[] left, int[] right) {
        int[] res = new int[left.length + right.length];
        for (int index = 0,i = 0,j = 0; index < res.length; index++) {
            /*left遍歷完*/
            if (i >= left.length) {
                res[index] = right[j++];
            } else if (j >= right.length) {
                res[index] = left[i++];
            } else if (left[i] < right[j]) {
                res[index] = left[i++];
            } else {
                res[index] = right[j++];
            }
         }
        return res;
    }
歸并排序

快速排序
分治法)從當(dāng)前數(shù)組中挑出一個元素作為基準(zhǔn)框产,將小于基準(zhǔn)的元素放在基準(zhǔn)的左邊,大于基準(zhǔn)的元素放在基準(zhǔn)右邊错洁,從而得到基準(zhǔn)的左子串和右子串秉宿,然后按照上述規(guī)則遞歸處理左子串和右子串,最終得到一個有序的數(shù)組屯碴。

public static void QuickSort(int[] array, int low, int high) {
        /*遞歸終止條件, 如果子串中只有一個元素則不處理*/
        if (low >= high) {
            return;
        }
        int i = low, j = high, pivot = array[low], temp;
        while (i < j) {
            /*必須先處理j, 保證該輪結(jié)束后是較小數(shù)和基準(zhǔn)數(shù)互換*/
            while (pivot <= array[j] && i < j) {
                j--;
            }
            while (pivot >= array[i] && i < j) {
                i++;
            }
            /*互換array[i]和array[j], 使數(shù)列相對有序*/
            if (i < j) {
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
        /*基準(zhǔn)數(shù)和ij互換*/
        array[low] = array[i];
        array[i] = pivot;
        /*遞歸調(diào)用左半數(shù)組*/
        QuickSort(array, low, j-1);
        //遞歸調(diào)用右半數(shù)組
        QuickSort(array, j+1, high);
    }
快速排序

堆排序

堆積是一個近似完全二叉樹的結(jié)構(gòu)描睦,并同時滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)。

首先根據(jù)數(shù)組構(gòu)建一個無序的完全二叉樹导而,根據(jù)堆積的性質(zhì)將二叉樹轉(zhuǎn)換成堆積忱叭,轉(zhuǎn)換完成后根節(jié)點(diǎn)即為當(dāng)前數(shù)組中的最大值,將根節(jié)點(diǎn)與樹中最后一個葉子節(jié)點(diǎn)互換今艺,并刪除該葉子節(jié)點(diǎn)韵丑,此時完全二叉樹又變成了無序狀態(tài),按照上述規(guī)則類推虚缎,直到樹為空埂息。


堆排序

(10條消息) 超詳細(xì)十大經(jīng)典排序算法總結(jié)(java代碼)c或者cpp的也可以明白Top_Spirit的博客-CSDN博客排序算法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遥巴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌享幽,老刑警劉巖铲掐,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異值桩,居然都是意外死亡摆霉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來携栋,“玉大人搭盾,你說我怎么就攤上這事⊥裰В” “怎么了鸯隅?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長向挖。 經(jīng)常有香客問我蝌以,道長,這世上最難降的妖魔是什么何之? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任跟畅,我火速辦了婚禮,結(jié)果婚禮上溶推,老公的妹妹穿的比我還像新娘徊件。我一直安慰自己,他們只是感情好蒜危,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布虱痕。 她就那樣靜靜地躺著,像睡著了一般舰褪。 火紅的嫁衣襯著肌膚如雪皆疹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天占拍,我揣著相機(jī)與錄音略就,去河邊找鬼。 笑死晃酒,一個胖子當(dāng)著我的面吹牛表牢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贝次,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼崔兴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛔翅?” 一聲冷哼從身側(cè)響起敲茄,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎山析,沒想到半個月后堰燎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笋轨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年秆剪,在試婚紗的時候發(fā)現(xiàn)自己被綠了赊淑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡仅讽,死狀恐怖陶缺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洁灵,我是刑警寧澤饱岸,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站处渣,受9級特大地震影響伶贰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜罐栈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一黍衙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荠诬,春花似錦琅翻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钧嘶,卻和暖如春棠众,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背有决。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工闸拿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人书幕。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓新荤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親台汇。 傳聞我的和親對象是個殘疾皇子苛骨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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