js十大經(jīng)典排序算法

冒泡排序

冒泡排序(Bubble Sort)也是一種簡(jiǎn)單直觀的排序算法疫向。它重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素豪嚎,如果他們的順序錯(cuò)誤就把他們交換過(guò)來(lái)搔驼。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成侈询。這個(gè)算法的名字由來(lái)是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端舌涨。
作為最簡(jiǎn)單的排序算法之一,冒泡排序給我的感覺(jué)就像 Abandon 在單詞書(shū)里出現(xiàn)的感覺(jué)一樣扔字,每次都在第一頁(yè)第一位囊嘉,所以最熟悉。冒泡排序還有一種優(yōu)化算法革为,就是立一個(gè) flag扭粱,當(dāng)在一趟序列遍歷中元素沒(méi)有發(fā)生交換,則證明該序列已經(jīng)有序震檩。但這種改進(jìn)對(duì)于提升性能來(lái)說(shuō)并沒(méi)有什么太大作用琢蛤。

1. 算法步驟

1.比較相鄰的元素。如果第一個(gè)比第二個(gè)大恳蹲,就交換他們兩個(gè)虐块。
2.對(duì)每一對(duì)相鄰元素作同樣的工作,從開(kāi)始第一對(duì)到結(jié)尾的最后一對(duì)嘉蕾。這步做完后贺奠,最后的元素會(huì)是最大的數(shù)。
3.針對(duì)所有的元素重復(fù)以上的步驟错忱,除了最后一個(gè)儡率。
4.持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟挂据,直到?jīng)]有任何一對(duì)數(shù)字需要比較。

2. 動(dòng)圖演示
1.gif
3. 什么時(shí)候最快

當(dāng)輸入的數(shù)據(jù)已經(jīng)是正序時(shí)(都已經(jīng)是正序了儿普,我還要你冒泡排序有何用捌樘印)。

4. 什么時(shí)候最慢

當(dāng)輸入的數(shù)據(jù)是反序時(shí)(寫(xiě)一個(gè) for 循環(huán)反序輸出數(shù)據(jù)不就行了眉孩,干嘛要用你冒泡排序呢个绍,我是閑的嗎)。

5. JavaScript 代碼實(shí)現(xiàn)
function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len - 1; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j+1]) {        // 相鄰元素兩兩對(duì)比
                var temp = arr[j+1];        // 元素交換
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}

選擇排序

選擇排序是一種簡(jiǎn)單直觀的排序算法浪汪,無(wú)論什么數(shù)據(jù)進(jìn)去都是 O(n2) 的時(shí)間復(fù)雜度巴柿。所以用到它的時(shí)候,數(shù)據(jù)規(guī)模越小越好死遭。唯一的好處可能就是不占用額外的內(nèi)存空間了吧广恢。

1. 算法步驟

1.首先在未排序序列中找到最小(大)元素呀潭,存放到排序序列的起始位置
2.再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最卸っ浴(大)元素,然后放到已排序序列的末尾钠署。
3.重復(fù)第二步糠聪,直到所有元素均排序完畢。

2. 動(dòng)圖演示
2.gif
3. JavaScript 代碼實(shí)現(xiàn)
function selectionSort(arr) {
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {     // 尋找最小的數(shù)
                minIndex = j;                 // 將最小數(shù)的索引保存
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}

插入排序

插入排序的代碼實(shí)現(xiàn)雖然沒(méi)有冒泡排序和選擇排序那么簡(jiǎn)單粗暴踏幻,但它的原理應(yīng)該是最容易理解的了枷颊,因?yàn)橹灰蜻^(guò)撲克牌的人都應(yīng)該能夠秒懂。插入排序是一種最簡(jiǎn)單直觀的排序算法该面,它的工作原理是通過(guò)構(gòu)建有序序列夭苗,對(duì)于未排序數(shù)據(jù),在已排序序列中從后向前掃描隔缀,找到相應(yīng)位置并插入题造。

插入排序和冒泡排序一樣,也有一種優(yōu)化算法猾瘸,叫做拆半插入界赔。

1. 算法步驟

1.將第一待排序序列第一個(gè)元素看做一個(gè)有序序列,把第二個(gè)元素到最后一個(gè)元素當(dāng)成是未排序序列牵触。
2.從頭到尾依次掃描未排序序列淮悼,將掃描到的每個(gè)元素插入有序序列的適當(dāng)位置。(如果待插入的元素與有序序列中的某個(gè)元素相等揽思,則將待插入元素插入到相等元素的后面袜腥。)

2. 動(dòng)圖演示
3.gif
3.JavaScript 代碼實(shí)現(xiàn)
function insertionSort(arr) {
    var len = arr.length;
    var preIndex, current;
    for (var i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while(preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex+1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex+1] = current;
    }
    return arr;
}

希爾排序

希爾排序,也稱遞減增量排序算法钉汗,是插入排序的一種更高效的改進(jìn)版本羹令。但希爾排序是非穩(wěn)定排序算法鲤屡。
希爾排序是基于插入排序的以下兩點(diǎn)性質(zhì)而提出改進(jìn)方法的:

  • 插入排序在對(duì)幾乎已經(jīng)排好序的數(shù)據(jù)操作時(shí),效率高福侈,即可以達(dá)到線性排序的效率酒来;
  • 但插入排序一般來(lái)說(shuō)是低效的,因?yàn)椴迦肱判蛎看沃荒軐?shù)據(jù)移動(dòng)一位肪凛;

希爾排序的基本思想是:先將整個(gè)待排序的記錄序列分割成為若干子序列分別進(jìn)行直接插入排序堰汉,待整個(gè)序列中的記錄“基本有序”時(shí),再對(duì)全體記錄進(jìn)行依次直接插入排序伟墙。

1. 算法步驟
  1. 選擇一個(gè)增量序列 t1衡奥,t2,……远荠,tk,其中 ti > tj, tk = 1失息;
  2. 按增量序列個(gè)數(shù) k譬淳,對(duì)序列進(jìn)行 k 趟排序;
  3. 每趟排序盹兢,根據(jù)對(duì)應(yīng)的增量 ti邻梆,將待排序列分割成若干長(zhǎng)度為 m 的子序列,分別對(duì)各子表進(jìn)行直接插入排序绎秒。僅增量因子為 1 時(shí)浦妄,整個(gè)序列作為一個(gè)表來(lái)處理,表長(zhǎng)度即為整個(gè)序列的長(zhǎng)度见芹。
2. JavaScript 代碼實(shí)現(xiàn)
function shellSort(arr) {
    var len = arr.length,
        temp,
        gap = 1;
    while(gap < len/3) {          //動(dòng)態(tài)定義間隔序列
        gap =gap*3+1;
    }
    for (gap; gap > 0; gap = Math.floor(gap/3)) {
        for (var i = gap; i < len; i++) {
            temp = arr[i];
            for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
                arr[j+gap] = arr[j];
            }
            arr[j+gap] = temp;
        }
    }
    return arr;
}

歸并排序

歸并排序(Merge sort)是建立在歸并操作上的一種有效的排序算法剂娄。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。

作為一種典型的分而治之思想的算法應(yīng)用玄呛,歸并排序的實(shí)現(xiàn)由兩種方法:

  • 自上而下的遞歸(所有遞歸的方法都可以用迭代重寫(xiě)阅懦,所以就有了第 2 種方法);
  • 自下而上的迭代徘铝;

和選擇排序一樣耳胎,歸并排序的性能不受輸入數(shù)據(jù)的影響,但表現(xiàn)比選擇排序好的多惕它,因?yàn)槭冀K都是 O(nlogn) 的時(shí)間復(fù)雜度怕午。代價(jià)是需要額外的內(nèi)存空間。

2. 算法步驟
  1. 申請(qǐng)空間淹魄,使其大小為兩個(gè)已經(jīng)排序序列之和郁惜,該空間用來(lái)存放合并后的序列;
  2. 設(shè)定兩個(gè)指針揭北,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置扳炬;
  3. 比較兩個(gè)指針?biāo)赶虻脑乩粲保x擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置恨樟;
  4. 重復(fù)步驟 3 直到某一指針達(dá)到序列尾半醉;
  5. 將另一序列剩下的所有元素直接復(fù)制到合并序列尾。
3. 動(dòng)圖演示
4.gif
4. JavaScript 代碼實(shí)現(xiàn)
function mergeSort(arr) {  // 采用自上而下的遞歸方法
    var len = arr.length;
    if(len < 2) {
        return arr;
    }
    var middle = Math.floor(len / 2),
        left = arr.slice(0, middle),
        right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right)
{
    var result = [];

    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    }

    while (left.length)
        result.push(left.shift());

    while (right.length)
        result.push(right.shift());

    return result;
}

快速排序

快速排序是由東尼·霍爾所發(fā)展的一種排序算法劝术。在平均狀況下缩多,排序 n 個(gè)項(xiàng)目要 Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較养晋,但這種狀況并不常見(jiàn)衬吆。事實(shí)上,快速排序通常明顯比其他 Ο(nlogn) 算法更快绳泉,因?yàn)樗膬?nèi)部循環(huán)(inner loop)可以在大部分的架構(gòu)上很有效率地被實(shí)現(xiàn)出來(lái)逊抡。

快速排序使用分治法(Divide and conquer)策略來(lái)把一個(gè)串行(list)分為兩個(gè)子串行(sub-lists)。

快速排序又是一種分而治之思想在排序算法上的典型應(yīng)用零酪。本質(zhì)上來(lái)看冒嫡,快速排序應(yīng)該算是在冒泡排序基礎(chǔ)上的遞歸分治法。

快速排序的名字起的是簡(jiǎn)單粗暴四苇,因?yàn)橐宦?tīng)到這個(gè)名字你就知道它存在的意義孝凌,就是快,而且效率高月腋!它是處理大數(shù)據(jù)最快的排序算法之一了蟀架。雖然 Worst Case 的時(shí)間復(fù)雜度達(dá)到了 O(n2),但是人家就是優(yōu)秀榆骚,在大多數(shù)情況下都比平均時(shí)間復(fù)雜度為 O(n logn) 的排序算法表現(xiàn)要更好片拍。

1. 算法步驟
  1. 從數(shù)列中挑出一個(gè)元素,稱為 “基準(zhǔn)”(pivot);
  2. 重新排序數(shù)列寨躁,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面穆碎,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后职恳,該基準(zhǔn)就處于數(shù)列的中間位置所禀。這個(gè)稱為分區(qū)(partition)操作;
  3. 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序放钦;

遞歸的最底部情形色徘,是數(shù)列的大小是零或一,也就是永遠(yuǎn)都已經(jīng)被排序好了操禀。雖然一直遞歸下去褂策,但是這個(gè)算法總會(huì)退出,因?yàn)樵诿看蔚牡╥teration)中,它至少會(huì)把一個(gè)元素?cái)[到它最后的位置去斤寂。

2. 動(dòng)圖演示
5.gif
3. JavaScript 代碼實(shí)現(xiàn)
function quickSort(arr, left, right) {
    var len = arr.length,
        partitionIndex,
        left = typeof left != 'number' ? 0 : left,
        right = typeof right != 'number' ? len - 1 : right;

    if (left < right) {
        partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex-1);
        quickSort(arr, partitionIndex+1, right);
    }
    return arr;
}

function partition(arr, left ,right) {     // 分區(qū)操作
    var pivot = left,                      // 設(shè)定基準(zhǔn)值(pivot)
        index = pivot + 1;
    for (var i = index; i <= right; i++) {
        if (arr[i] < arr[pivot]) {
            swap(arr, i, index);
            index++;
        }        
    }
    swap(arr, pivot, index - 1);
    return index-1;
}

function swap(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
functiion paritition2(arr, low, high) {
  let pivot = arr[low];
  while (low < high) {
    while (low < high && arr[high] > pivot) {
      --high;
    }
    arr[low] = arr[high];
    while (low < high && arr[low] <= pivot) {
      ++low;
    }
    arr[high] = arr[low];
  }
  arr[low] = pivot;
  return low;
}

function quickSort2(arr, low, high) {
  if (low < high) {
    let pivot = paritition2(arr, low, high);
    quickSort2(arr, low, pivot - 1);
    quickSort2(arr, pivot + 1, high);
  }
  return arr;
}

堆排序

堆排序(Heapsort)是指利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法耿焊。堆積是一個(gè)近似完全二叉樹(shù)的結(jié)構(gòu),并同時(shí)滿足堆積的性質(zhì):即子結(jié)點(diǎn)的鍵值或索引總是小于(或者大于)它的父節(jié)點(diǎn)遍搞。堆排序可以說(shuō)是一種利用堆的概念來(lái)排序的選擇排序罗侯。分為兩種方法:

  1. 大頂堆:每個(gè)節(jié)點(diǎn)的值都大于或等于其子節(jié)點(diǎn)的值,在堆排序算法中用于升序排列溪猿;
  2. 小頂堆:每個(gè)節(jié)點(diǎn)的值都小于或等于其子節(jié)點(diǎn)的值钩杰,在堆排序算法中用于降序排列;

堆排序的平均時(shí)間復(fù)雜度為 Ο(nlogn)诊县。

1. 算法步驟
  1. 創(chuàng)建一個(gè)堆 H[0……n-1]讲弄;
  2. 把堆首(最大值)和堆尾互換;
  3. 把堆的尺寸縮小 1依痊,并調(diào)用 shift_down(0)避除,目的是把新的數(shù)組頂端數(shù)據(jù)調(diào)整到相應(yīng)位置;
  4. 重復(fù)步驟 2胸嘁,直到堆的尺寸為 1驹饺。
2. 動(dòng)圖演示
6.gif
3. JavaScript 代碼實(shí)現(xiàn)
var len;    // 因?yàn)槁暶鞯亩鄠€(gè)函數(shù)都需要數(shù)據(jù)長(zhǎng)度,所以把len設(shè)置成為全局變量

function buildMaxHeap(arr) {   // 建立大頂堆
    len = arr.length;
    for (var i = Math.floor(len/2); i >= 0; i--) {
        heapify(arr, i);
    }
}

function heapify(arr, i) {     // 堆調(diào)整
    var left = 2 * i + 1,
        right = 2 * i + 2,
        largest = i;

    if (left < len && arr[left] > arr[largest]) {
        largest = left;
    }

    if (right < len && arr[right] > arr[largest]) {
        largest = right;
    }

    if (largest != i) {
        swap(arr, i, largest);
        heapify(arr, largest);
    }
}

function swap(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

function heapSort(arr) {
    buildMaxHeap(arr);

    for (var i = arr.length-1; i > 0; i--) {
        swap(arr, 0, i);
        len--;
        heapify(arr, 0);
    }
    return arr;
}

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

計(jì)數(shù)排序的核心在于將輸入的數(shù)據(jù)值轉(zhuǎn)化為鍵存儲(chǔ)在額外開(kāi)辟的數(shù)組空間中缴渊。作為一種線性時(shí)間復(fù)雜度的排序,計(jì)數(shù)排序要求輸入的數(shù)據(jù)必須是有確定范圍的整數(shù)鱼炒。

1. 動(dòng)圖演示
7.gif
2. JavaScript 代碼實(shí)現(xiàn)
function countingSort(arr, maxValue) {
    var bucket = new Array(maxValue+1),
        sortedIndex = 0;
        arrLen = arr.length,
        bucketLen = maxValue + 1;

    for (var i = 0; i < arrLen; i++) {
        if (!bucket[arr[i]]) {
            bucket[arr[i]] = 0;
        }
        bucket[arr[i]]++;
    }

    for (var j = 0; j < bucketLen; j++) {
        while(bucket[j] > 0) {
            arr[sortedIndex++] = j;
            bucket[j]--;
        }
    }

    return arr;
}

桶排序

桶排序是計(jì)數(shù)排序的升級(jí)版衔沼。它利用了函數(shù)的映射關(guān)系,高效與否的關(guān)鍵就在于這個(gè)映射函數(shù)的確定昔瞧。為了使桶排序更加高效指蚁,我們需要做到這兩點(diǎn):

  1. 在額外空間充足的情況下,盡量增大桶的數(shù)量
  2. 使用的映射函數(shù)能夠?qū)⑤斎氲?N 個(gè)數(shù)據(jù)均勻的分配到 K 個(gè)桶中

同時(shí)自晰,對(duì)于桶中元素的排序凝化,選擇何種比較排序算法對(duì)于性能的影響至關(guān)重要。

1. 什么時(shí)候最快

當(dāng)輸入的數(shù)據(jù)可以均勻的分配到每一個(gè)桶中酬荞。

2. 什么時(shí)候最慢

當(dāng)輸入的數(shù)據(jù)被分配到了同一個(gè)桶中搓劫。

3. JavaScript 代碼實(shí)現(xiàn)
function bucketSort(arr, bucketSize) {
    if (arr.length === 0) {
      return arr;
    }

    var i;
    var minValue = arr[0];
    var maxValue = arr[0];
    for (i = 1; i < arr.length; i++) {
      if (arr[i] < minValue) {
          minValue = arr[i];                // 輸入數(shù)據(jù)的最小值
      } else if (arr[i] > maxValue) {
          maxValue = arr[i];                // 輸入數(shù)據(jù)的最大值
      }
    }

    //桶的初始化
    var DEFAULT_BUCKET_SIZE = 5;            // 設(shè)置桶的默認(rèn)數(shù)量為5
    bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
    var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;   
    var buckets = new Array(bucketCount);
    for (i = 0; i < buckets.length; i++) {
        buckets[i] = [];
    }

    //利用映射函數(shù)將數(shù)據(jù)分配到各個(gè)桶中
    for (i = 0; i < arr.length; i++) {
        buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
    }

    arr.length = 0;
    for (i = 0; i < buckets.length; i++) {
        insertionSort(buckets[i]);                      // 對(duì)每個(gè)桶進(jìn)行排序,這里使用了插入排序
        for (var j = 0; j < buckets[i].length; j++) {
            arr.push(buckets[i][j]);                      
        }
    }

    return arr;
}

基數(shù)排序

基數(shù)排序是一種非比較型整數(shù)排序算法混巧,其原理是將整數(shù)按位數(shù)切割成不同的數(shù)字枪向,然后按每個(gè)位數(shù)分別比較。由于整數(shù)也可以表達(dá)字符串(比如名字或日期)和特定格式的浮點(diǎn)數(shù)咧党,所以基數(shù)排序也不是只能使用于整數(shù)秘蛔。

1. 基數(shù)排序 vs 計(jì)數(shù)排序 vs 桶排序

基數(shù)排序有兩種方法:

這三種排序算法都利用了桶的概念,但對(duì)桶的使用方法上有明顯差異:

  • 基數(shù)排序:根據(jù)鍵值的每位數(shù)字來(lái)分配桶;
  • 計(jì)數(shù)排序:每個(gè)桶只存儲(chǔ)單一鍵值深员;
  • 桶排序:每個(gè)桶存儲(chǔ)一定范圍的數(shù)值负蠕;
2. LSD 基數(shù)排序動(dòng)圖演示
8.gif
3. JavaScript 代碼實(shí)現(xiàn)
//LSD Radix Sort
var counter = [];
function radixSort(arr, maxDigit) {
    var mod = 10;
    var dev = 1;
    for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
        for(var j = 0; j < arr.length; j++) {
            var bucket = parseInt((arr[j] % mod) / dev);
            if(counter[bucket]==null) {
                counter[bucket] = [];
            }
            counter[bucket].push(arr[j]);
        }
        var pos = 0;
        for(var j = 0; j < counter.length; j++) {
            var value = null;
            if(counter[j]!=null) {
                while ((value = counter[j].shift()) != null) {
                      arr[pos++] = value;
                }
          }
        }
    }
    return arr;
}

時(shí)間換空間以及空間換時(shí)間

// 兩個(gè)數(shù)字進(jìn)行交換


//時(shí)優(yōu) 運(yùn)用空間而減少了時(shí)間的使用
function swap(a, b) {
    var c;
    c = a;
    a = b;
    b = a;
}
//空優(yōu) 運(yùn)用時(shí)間而減少了空間的使用
function swap(a, b) {
    a = a + b;
    b = a - b;
    a = a - b;
}

數(shù)組去重,也是一個(gè)典型的用空間換時(shí)間的例子

function unique(arr) {
    var obj = {}
    var result = []
    for(var i in arr) {
        if(!obj[arr[i]]) {
            obj[arr[i]] = true;
            result.push(arr[i]);
        }
    }
    return result;
}

算法的效率:

  1. 時(shí)間復(fù)雜度:評(píng)估執(zhí)行程序所需的時(shí)間倦畅≌谔牵可以估算出程序?qū)μ幚砥鞯氖褂贸潭?/li>
  2. 空間復(fù)雜度:評(píng)估執(zhí)行程序所需的存儲(chǔ)空間√下酰可以估算出程序?qū)τ?jì)算機(jī)內(nèi)存的使用程度
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末止吁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子燎悍,更是在濱河造成了極大的恐慌敬惦,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谈山,死亡現(xiàn)場(chǎng)離奇詭異俄删,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)奏路,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)畴椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鸽粉,你說(shuō)我怎么就攤上這事斜脂。” “怎么了触机?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵帚戳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我儡首,道長(zhǎng)片任,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任蔬胯,我火速辦了婚禮对供,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氛濒。我一直安慰自己产场,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布舞竿。 她就那樣靜靜地躺著涝动,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炬灭。 梳的紋絲不亂的頭發(fā)上醋粟,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天靡菇,我揣著相機(jī)與錄音,去河邊找鬼米愿。 笑死厦凤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的育苟。 我是一名探鬼主播较鼓,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼违柏!你這毒婦竟也來(lái)了博烂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漱竖,失蹤者是張志新(化名)和其女友劉穎禽篱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體馍惹,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躺率,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了万矾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悼吱。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖良狈,靈堂內(nèi)的尸體忽然破棺而出后添,到底是詐尸還是另有隱情,我是刑警寧澤薪丁,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布吕朵,位于F島的核電站,受9級(jí)特大地震影響窥突,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硫嘶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一阻问、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沦疾,春花似錦称近、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至忆畅,卻和暖如春衡未,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工缓醋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留如失,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓送粱,卻偏偏與公主長(zhǎng)得像褪贵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抗俄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • 排序算法說(shuō)明 (1)排序的定義:對(duì)一序列對(duì)象根據(jù)某個(gè)關(guān)鍵字進(jìn)行排序脆丁; 輸入:n個(gè)數(shù):a1,a2,a3,…,an輸出...
    BULL_DEBUG閱讀 769評(píng)論 0 3
  • Ba la la la ~ 讀者朋友們,你們好啊动雹,又到了冷鋒時(shí)間槽卫,話不多說(shuō),發(fā)車(chē)洽胶! 1.冒泡排序(Bub...
    王飽飽閱讀 1,790評(píng)論 0 7
  • 十大經(jīng)典排序算法 來(lái)源:https://github.com/wangguanfu/-Sorting-algori...
    星丶雲(yún)閱讀 791評(píng)論 0 7
  • 天地有大美晒夹,人心存幽微,都值得敬畏姊氓。 有了女兒后丐怯,慶山在作品中經(jīng)常會(huì)提到養(yǎng)育孩子的想法,“有什么可以著急的呢翔横?孩子...
    棉布萍閱讀 880評(píng)論 1 6
  • 重回大唐夢(mèng)長(zhǎng)安读跷,原想舊貌換新顏。 工程在建五路口禾唁,熙熙攘攘校門(mén)前效览。 門(mén)禁保安不相識(shí),學(xué)員依舊好少年荡短。 亭臺(tái)水榭貴賓...
    雕兄_KYP閱讀 352評(píng)論 9 3