數(shù)據(jù)結(jié)構(gòu)十大排序算法講解:算法原理和LeetCode代碼實(shí)現(xiàn)(C++晨仑,java)

<font color=red>說(shuō)明:下述內(nèi)容除了少許圖片選取自他人網(wǎng)站褐墅,其余均為本人獨(dú)創(chuàng)。</font>

0洪己、排序算法導(dǎo)論

排序的概念

??數(shù)據(jù)結(jié)構(gòu)中的一個(gè)重點(diǎn)概念就是內(nèi)部排序妥凳,內(nèi)部排序是指待排序列完全存放在內(nèi)存中所進(jìn)行的排序過(guò)程,適合不太大的元素序列答捕。其功能是對(duì)一個(gè)數(shù)據(jù)元素集合或序列重新排列成一個(gè)按數(shù)據(jù)元素某個(gè)相知有序(遞增逝钥,遞減)的序列。

排序的分類(lèi)

  • 插入類(lèi)排序:直接插入排序拱镐、希爾排序艘款。
  • 交換類(lèi)排序:冒泡排序、快速排序沃琅。
  • 選擇排序:簡(jiǎn)單選擇排序哗咆、堆排序。
  • 歸并排序益眉。
  • 基數(shù)排序晌柬。
  • 桶排序姥份。
  • 計(jì)數(shù)排序

術(shù)語(yǔ)說(shuō)明

  • 穩(wěn)定的排序: 排序過(guò)程中有前后兩個(gè)元素相同的點(diǎn)年碘,待排序結(jié)束后澈歉,這兩個(gè)相同的點(diǎn)的相對(duì)前后位置<font color=purple>不發(fā)生</font>變化。
  • 不穩(wěn)定的排序: 排序過(guò)程中有前后兩個(gè)元素相同的點(diǎn)屿衅,待排序結(jié)束后埃难,這兩個(gè)相同的點(diǎn)的相對(duì)前后位置<font color=purple>發(fā)生了</font>變化。
  • 時(shí)間復(fù)雜度: 一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間傲诵。
  • 空間復(fù)雜度:執(zhí)行完一個(gè)程序所需內(nèi)存的大小凯砍。

算法種類(lèi)、時(shí)間復(fù)雜度拴竹、空間復(fù)雜度悟衩、是否穩(wěn)定

image

out-place:占用額外內(nèi)存。
k:桶的個(gè)數(shù)栓拜。

算法分類(lèi)

image

<font color=red>注意:本博客涉及到的所有排序算法均是升序排序座泳!</font>


1、直接插入排序

算法描述

??直接插入排序的過(guò)程是最開(kāi)始固定頭一個(gè)元素幕与,然后在第二個(gè)元素開(kāi)始挑势,從前面已經(jīng)排好序的序列中,選擇一個(gè)合適的位置啦鸣,將待插入元素插入到前面排好序的序列中潮饱。方法是從后向前的掃描序列,每掃描一次元素向后移動(dòng)一個(gè)位置诫给。


image

代碼實(shí)現(xiàn)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int i = 1, j = 0;
        for(; i < nums.size(); i++){
            int tmp = nums[i];
            for(j = i; j > 0; j--){
                if(tmp < nums[j - 1])
                    nums[j] = nums[j - 1];  
                else
                    break;      
            }
            nums[j] = tmp; // 該賦值語(yǔ)句要寫(xiě)在for循環(huán)的外面香拉,否則當(dāng)待排序元素需要排在第0個(gè)位置時(shí),無(wú)法正確處理中狂。
        }
        return nums;
    }
};

運(yùn)行截圖

在這里插入圖片描述

2凫碌、希爾排序

算法描述

??希爾排序也稱(chēng)為縮小增量排序,是直接插入類(lèi)排序的改進(jìn)方法胃榕,時(shí)間復(fù)雜度在\text o(\text n\log{\text n})盛险。算法思想是每次選一定的增量為一個(gè)分組,在該分組中進(jìn)行直接插入排序勋又。下一輪減小增量苦掘,再使用相同的方法, 直到增量為1為止楔壤,對(duì)全體元素執(zhí)行整體的直接插入排序算法鹤啡。

??嚴(yán)蔚敏的數(shù)據(jù)結(jié)構(gòu)課本中的希爾排序法的增量為:5, 3挺邀, 1揉忘,這也是一般的計(jì)算機(jī)考研中數(shù)據(jù)結(jié)構(gòu)題目中的希爾排序增量。

??下面的代碼中的增量是數(shù)組長(zhǎng)的\frac{1}{2}端铛,隨后依次2倍遞減泣矛。

image

代碼實(shí)現(xiàn)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {  
        int len = nums.size(), tmp = 0;
        int gap = len / 2;
        for(; gap; gap /= 2){
            for(int i = gap; i < len; i++){
                tmp = nums[i];
                int preIndex = i - gap;
                while(preIndex >= 0 and nums[preIndex] > tmp){
                    nums[preIndex + gap] = nums[preIndex];
                    preIndex -= gap;
                }
                nums[preIndex + gap] = tmp;
            }
        }     
        return nums;
    }
};

運(yùn)行截圖

在這里插入圖片描述

3、冒泡排序

算法描述

??冒泡排序的過(guò)程是從左至右依次比較兩個(gè)相鄰的元素禾蚕,若前面的元素大于后面的元素您朽,則交換兩個(gè)元素,否則不執(zhí)行操作换淆。待指針從左至右遍歷結(jié)束后哗总,數(shù)組中的最大值便被交換到了最右邊,依稀類(lèi)推倍试,直到在某一輪遍歷的過(guò)程中沒(méi)有元素發(fā)生交換為止讯屈。

??由于整個(gè)過(guò)程就像冒泡一樣,所以名為冒泡排序县习。

image

代碼實(shí)現(xiàn)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int i = nums.size() - 1, j = 0;
        for(; i > 0; i--){
            bool flag = true; // 設(shè)置flag是冒泡排序的優(yōu)化算法
            for(j = 0; j < i; j++){
                if(nums[j] > nums[j + 1]){
                    swap(nums[j], nums[j + 1]);
                    flag = false;
                }
            }    
            if(flag)
                break;     
        }           
        return nums;
    }
};

運(yùn)行截圖

在這里插入圖片描述

4涮母、快速排序

算法描述

??快速排序也是交換類(lèi)排序的一種。思想是通過(guò)設(shè)置一個(gè)點(diǎn)為樞軸(一般為數(shù)組中的第一個(gè)元素)躁愿,通過(guò)一趟排序之后叛本,樞軸位于序列的中部位置,要求樞軸的左邊元素均小于樞軸彤钟,樞軸的右邊元素均大于樞軸来候。再分別遞歸對(duì)樞軸左邊的元素和樞軸右邊的元素執(zhí)行快速排序直到數(shù)列整體有序?yàn)橹埂?/p>

??具體實(shí)現(xiàn):設(shè)置指針指向序列的最右邊元素,依次從右向左遍歷數(shù)組逸雹,找到第一個(gè)不大于樞軸的元素营搅,將樞軸的值與該值交換,然后再?gòu)淖笙蛴乙来伪闅v數(shù)組找到第一個(gè)不小于樞軸的值峡眶,將樞軸的值與該值交換幽纷,指針再指向右邊沒(méi)有遍歷的位置開(kāi)始遍歷叠洗,方法與上述相同,以此類(lèi)推,直到樞軸處于數(shù)組的中部無(wú)可交換的元素為止椰憋。第一輪快速排序結(jié)束,再分別對(duì)樞軸兩邊的序列遞歸調(diào)用快速排序的方法魏割,直到整體元素有序?yàn)橹埂?/p>

動(dòng)態(tài)圖和下述代碼的樞軸選取略有不符廊勃。


image

代碼實(shí)現(xiàn)(嚴(yán)蔚敏《數(shù)據(jù)結(jié)構(gòu)》定義樞軸函數(shù)寫(xiě)法)

class Solution {
public:
    int partition(vector<int>& nums,int low,int high){
            int pivot = nums[low];
            while(low < high){
                while(low < high and nums[high] >= pivot)
                    --high;
                nums[low] = nums[high];
                while(low < high and nums[low] <= pivot)
                    ++low;
                nums[high] = nums[low];
            }
            nums[low] = pivot;
            return low;
    } 
    void QuickSort(vector<int>& nums,int low,int high){
        if(low < high){
            int pivotpos = partition(nums, low, high);
            QuickSort(nums, low, pivotpos - 1);
            QuickSort(nums, pivotpos + 1, high);
        }
    } 
    vector<int> sortArray(vector<int>& nums) { // 主函數(shù)
        int n = nums.size();
        QuickSort(nums, 0, n - 1);
        return nums;
    }
};

運(yùn)行截圖

在這里插入圖片描述

顯然時(shí)間復(fù)雜度要快于上面的希爾排序。

代碼實(shí)現(xiàn)(考研《天勤高分筆記》的寫(xiě)法)

class Solution {
public:
    void quickSort(vector<int>& nums, int left, int right) {
        if (left >= right)
            return;
        int cur = left + 1; // 從左側(cè)第二個(gè)元素開(kāi)始
        int low = left;    // 分界點(diǎn)為第一個(gè)元素
        while (cur <= right) {
            if (nums[cur] <= nums[left]) { // 交換位置保證low的左側(cè)都是小于num[left]
                swap(nums[low + 1], nums[cur]);
                low++;
            }
            cur++;
        }
        swap(nums[left], nums[low]);   // 把分界點(diǎn)元素移動(dòng)到新的分界位置
        quickSort(nums, left, low - 1);
        quickSort(nums, low + 1, right);
    }
    vector<int> sortArray(vector<int>& nums) { //主函數(shù)
        int n = nums.size();
        quickSort(nums, 0, n - 1);
        return nums;
    }
};

運(yùn)行截圖

在這里插入圖片描述

5搬男、簡(jiǎn)單選擇排序

算法描述

??簡(jiǎn)單選擇排序是選擇類(lèi)排序拣展,算法思想是從左至右遍歷數(shù)組,首先固定數(shù)組中的第一個(gè)元素缔逛,分別與剩余的所有元素進(jìn)行比較备埃,從而找到序列中的最小值和固定元素交換姓惑,如果固定元素就是最小值,則無(wú)需交換按脚。以此類(lèi)推于毙,直到整體元素有序?yàn)橹埂?/p>

image

代碼實(shí)現(xiàn)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
       int n = nums.size();
       for(int i = 0; i < n; i++){
           int m = i;
           for(int j = i + 1; j < n; j++){
                if(nums[m] > nums[j])
                    m = j;
           } 
            swap(nums[i], nums[m]);
       }
       return nums; 
    }
};

運(yùn)行截圖

在這里插入圖片描述

6、堆排序

算法描述

??堆排序?qū)儆谶x擇排序辅搬,是簡(jiǎn)單選擇排序的優(yōu)化唯沮。算法思想:排序?yàn)樯颍⒋箜敹选?/p>

  • 將數(shù)組中的元素從前向后依次抽象成一個(gè)完全二叉樹(shù)堪遂,并保證根結(jié)點(diǎn)的值大于孩子結(jié)點(diǎn)的值介蛉,它的每棵子樹(shù)保持這個(gè)性質(zhì)。
  • 這就需要對(duì)二叉樹(shù)的值進(jìn)行調(diào)整溶褪,最下面最右面的子樹(shù)開(kāi)始币旧,由下到上調(diào)整,如果孩子結(jié)點(diǎn)的值大于父結(jié)點(diǎn)的值猿妈,則將孩子結(jié)點(diǎn)的值和父結(jié)點(diǎn)的值進(jìn)行交換佳恬,以此類(lèi)推,直到滿足上面的性質(zhì)為止于游。
  • 此時(shí)最大值存在于根結(jié)點(diǎn)毁葱,將根結(jié)點(diǎn)與最右邊葉子結(jié)點(diǎn)的值進(jìn)行交換,此時(shí)贰剥,整個(gè)序列的最大值被存放在整個(gè)數(shù)組的最右邊倾剿。
  • 再將剩余的n - 1個(gè)序列按照從根結(jié)點(diǎn)與其左右孩子比較的方法調(diào)整為大頂堆,再與倒數(shù)第二個(gè)結(jié)點(diǎn)進(jìn)行交換蚌成。
  • 循環(huán)上述過(guò)程前痘,直到所有結(jié)點(diǎn)全部有序。

??可見(jiàn)下面的兩幅圖担忧,方法原理都是一樣的芹缔。

image

image

算法實(shí)現(xiàn)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int len = nums.size();
        buildMaxHeap(nums, len); // 構(gòu)建一個(gè)大頂堆 升序排列
        return nums;
    }
    void buildMaxHeap(vector<int>& nums, int len){
        //第一個(gè)for循環(huán) 從下到上 調(diào)整為大頂堆
        for(int i = len / 2 - 1; i >= 0; i--)
            adjustHeap(nums, i, len); // 逐一調(diào)整為大頂堆
        for(int i = len - 1; i >= 0; i--){
            swap(nums[0], nums[i]);  // 交換根結(jié)點(diǎn)和最后的結(jié)點(diǎn) 最大值放在最后
            adjustHeap(nums, 0 , i); // 對(duì)剩下的序列從上到下調(diào)整為大頂堆
        }

    }
    // 從上到下 調(diào)整為大頂堆
    void adjustHeap(vector<int>& nums, int node, int len){
        int left = 2 * node + 1;
        int right = 2 * node + 2;
        int max = node; // 定義max 存儲(chǔ)某棵子樹(shù)的最大結(jié)點(diǎn)下標(biāo) 
        if(left < len and nums[left] > nums[max])
            max = left; // 存在左孩子 左孩子結(jié)點(diǎn)大于其父結(jié)點(diǎn)
        if(right < len and nums[right] > nums[max])
            max = right;  // 判斷該子樹(shù) 哪一個(gè)結(jié)點(diǎn)大于父結(jié)點(diǎn)
        if(max != node){ // 如果真存在子結(jié)點(diǎn)大于父結(jié)點(diǎn)的情況 進(jìn)行交換 
            swap(nums[max], nums[node]);
            adjustHeap(nums, max, len);// 交換后 判斷子樹(shù)結(jié)點(diǎn)是否滿足大頂堆的性質(zhì)
        }
    }

};

運(yùn)行截圖

在這里插入圖片描述

7、歸并排序

算法描述

??該算法的是采用分治法(Divide and Conquer)瓶盛。將已有序的子序列合并最欠,得到完全有序的序列;

  • 先使每個(gè)子序列有序惩猫,再使子序列段間有序芝硬。在嚴(yán)蔚敏《數(shù)據(jù)結(jié)構(gòu)與算法》課本中,將兩個(gè)有序表合并成一個(gè)有序表轧房,稱(chēng)為2-路歸并排序拌阴。
  • 把長(zhǎng)度為n的序列分成兩個(gè)長(zhǎng)度為\frac{n}{2}的子序列;
  • 對(duì)這兩個(gè)子序列使用遞歸分別再采用歸并排序奶镶;
  • 將兩個(gè)排序好的子序列合并成一個(gè)最終的排序序列迟赃。


    在這里插入圖片描述
image

2-路歸并排序動(dòng)態(tài)圖:


image

代碼實(shí)現(xiàn)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int n = nums.size();
        MergeSort(nums, 0, n - 1);
        return nums;
    }
    void MergeSort (vector<int>& nums, int low,int high) {
        if(low >= high) 
            return; // 終止遞歸的條件陪拘,子序列長(zhǎng)度為1
        int mid =  low + (high - low) / 2;  // 取得序列中間的元素
        MergeSort(nums, low, mid);  // 對(duì)左半邊遞歸
        MergeSort(nums, mid + 1, high);  // 對(duì)右半邊遞歸
        Merge(nums, low, mid, high);  // 合并
    }
    void Merge(vector<int>& nums, int low, int mid, int high){
        //low為第1有序區(qū)的第1個(gè)元素,i指向第1個(gè)元素, mid為第1有序區(qū)的最后1個(gè)元素
        int i = low,j = mid + 1, k = 0;  //mid+1為第2有序區(qū)第1個(gè)元素纤壁,j指向第1個(gè)元素
        int *temp = new int[high - low + 1]; //temp數(shù)組暫存合并的有序序列
        while(i <= mid && j <= high){
            if(nums[i] <= nums[j]) //較小的先存入temp中
                temp[k++] = nums[i++];
            else
                temp[k++] = nums[j++];
        }
        while(i <= mid)//若比較完之后藻丢,第一個(gè)有序區(qū)仍有剩余,則直接復(fù)制到t數(shù)組中
            temp[k++] = nums[i++];
        while(j <= high)//同上
            temp[k++] = nums[j++];
        for(i=low, k=0; i <= high; i++,k++)//將排好序的存回arr中l(wèi)ow到high這區(qū)間
        nums[i] = temp[k];
        delete [] temp;//釋放內(nèi)存摄乒,由于指向的是數(shù)組,必須用delete []
    }
};

運(yùn)行截圖

在這里插入圖片描述

8残黑、基數(shù)排序

算法描述

??基數(shù)排序是非比較的排序算法馍佑,對(duì)每一位進(jìn)行排序,從最低位開(kāi)始排序梨水,復(fù)雜度為O(kn)為數(shù)組長(zhǎng)度拭荤,k為數(shù)組中的數(shù)的最大的位數(shù);

  • 基數(shù)排序是按照低位先排序疫诽,然后收集舅世;
  • 再按照高位排序,然后再收集奇徒;
  • 以此類(lèi)推雏亚,直到最高位。

??有時(shí)候有些屬性是有優(yōu)先級(jí)順序的摩钙,先按低優(yōu)先級(jí)排序罢低,再按高優(yōu)先級(jí)排序。最后的次序就是高優(yōu)先級(jí)高的在前胖笛,高優(yōu)先級(jí)相同的低優(yōu)先級(jí)高的在前网持。基數(shù)排序基于分別排序长踊,分別收集功舀,所以是穩(wěn)定的。


image

代碼實(shí)現(xiàn)(java實(shí)現(xiàn)身弊,只允許有非負(fù)數(shù))

class Solution {
    public int[] sortArray(int[] nums) {
        if (nums.length < 2)
            return array;
        int max = nums[0];
        for (int i = 1; i < nums.length; i++) {
            max = Math.max(max, nums[i]);
        }
        int maxDigit = 0;
        while (max != 0) {
            max /= 10;
            maxDigit++;
        }
        int mod = 10, div = 1;
        ArrayList<ArrayList<Integer>> bucketList = new ArrayList<ArrayList<Integer>>();
        for (int i = 0; i < 10; i++)
            bucketList.add(new ArrayList<Integer>());
        for (int i = 0; i < maxDigit; i++, mod *= 10, div *= 10) {
            for (int j = 0; j < nums.length; j++) {
                int num = (nums[j] % mod) / div;
                bucketList.get(num).add(nums[j]);
            }
            int index = 0;
            for (int j = 0; j < bucketList.size(); j++) {
                for (int k = 0; k < bucketList.get(j).size(); k++)
                    nums[index++] = bucketList.get(j).get(k);
                bucketList.get(j).clear();
            }
        }
        return nums;
    }
}

9辟汰、計(jì)數(shù)排序

算法描述

??計(jì)數(shù)排序的過(guò)程是創(chuàng)建一個(gè)長(zhǎng)度為數(shù)組中最小和最大元素之差的數(shù)組,分別對(duì)應(yīng)數(shù)組中的每個(gè)元素阱佛,然后用這個(gè)新的數(shù)組來(lái)統(tǒng)計(jì)每個(gè)元素出現(xiàn)的頻率莉擒,然后遍歷新的數(shù)組,根據(jù)每個(gè)元素出現(xiàn)的頻率把元素放回到老的數(shù)組中瘫絮,得到已經(jīng)排好序的數(shù)組涨冀。


image

代碼實(shí)現(xiàn)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        if (nums.size() == 0)
            return nums;
        int min = *min_element(nums.begin(), nums.end());
        int max =*max_element(nums.begin(), nums.end());
        int bias = 0 - min;
        vector<int> bucket(max - min + 1, 0);
        for (int i = 0; i < nums.size(); i++) {
            bucket[nums[i] + bias]++;
        }
        int index = 0, i = 0;
        while (index < nums.size()) {
            if (bucket[i] != 0) {
                nums[index] = i - bias;
                bucket[i]--;
                index++;
            } else
                i++;
        }
        return nums;
    }
};

運(yùn)行截圖

在這里插入圖片描述

??該方法通過(guò)犧牲空間復(fù)雜度的方法換取時(shí)間復(fù)雜度的減少,是目前在LeetCode平臺(tái)上這些算法中運(yùn)行最快的方法麦萤。

??當(dāng)然鹿鳖,該方法也可以通過(guò)哈希表來(lái)實(shí)現(xiàn)扁眯。

代碼實(shí)現(xiàn)(map哈希表方法)

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        map<int, int> m;
        for(int& i : nums)
            m[i]++;
        int n = nums.size(), i = 0;
        while(i < n){
            if(m.begin()->second){
                nums[i++] = m.begin()->first;
                m.begin()->second--;
            }
            else
                m.erase(m.begin());
        } 
        return nums;
    }
};

運(yùn)行截圖

在這里插入圖片描述

??上述代碼的思路就是計(jì)數(shù)排序,但使用哈希表翅帜,時(shí)間復(fù)雜度大為增加姻檀,這值得引人思考。


10涝滴、桶排序

算法描述

??首先新建一個(gè)桶的數(shù)組绣版,每個(gè)桶的規(guī)則需要提前制定好,比如元素在0-9為一個(gè)桶歼疮、10-19為一個(gè)桶杂抽。然后遍歷整個(gè)待排序的數(shù)組,把元素分配到對(duì)應(yīng)的桶里面韩脏。接下來(lái)單獨(dú)對(duì)每個(gè)桶里面的元素進(jìn)行排序缩麸,排序算法可以選擇比較排序或者非比較排序,得到排序后的數(shù)組赡矢。最后把所有的桶內(nèi)的元素還原到原數(shù)組里面得到最后的排序數(shù)組杭朱。

image

代碼實(shí)現(xiàn)

class Solution {
    public int[] sortArray(int[] nums) {
        int INTERVAL = 100;               // 定義桶的大小
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        for (int num : nums) {            // 找到數(shù)組元素的范圍
            min = Math.min(min, num);
            max = Math.max(max, num);
        }
        int count = (max - min + 1);      // 計(jì)算出桶的數(shù)量
        int bucketSize = (count % INTERVAL == 0) ?( count / INTERVAL) : (count / INTERVAL+1);
        List<Integer>[] buckets = new List[bucketSize];
        for (int num : nums) {            // 把所有元素放入對(duì)應(yīng)的桶里面
            int quotient = (num-min) / INTERVAL;
            if (buckets[quotient] == null) buckets[quotient] = new ArrayList<>();
            buckets[quotient].add(num);
        }
        int cur = 0;
        for (List<Integer> bucket : buckets) {
            if (bucket != null) {
                bucket.sort(null);       // 對(duì)每個(gè)桶進(jìn)行排序
                for (Integer integer : bucket) {  // 還原桶里面的元素到原數(shù)組
                    nums[cur++] = integer;
                }
            }
        }
        return nums;
    }
}

運(yùn)行截圖

在這里插入圖片描述

總結(jié)

??通過(guò)上述數(shù)據(jù)結(jié)構(gòu)十大算法的講解和LeetCode系統(tǒng)的運(yùn)行,時(shí)間復(fù)雜度在o(n^2)級(jí)別的顯示超時(shí)吹散,只有時(shí)間復(fù)雜度稍低的才會(huì)顯示通過(guò)弧械。在上述過(guò)程中運(yùn)行最快的是計(jì)數(shù)排序,它是通過(guò)犧牲空間復(fù)雜度來(lái)?yè)Q取的高效運(yùn)行空民,其次是快速排序梦谜,快速排序的空間復(fù)雜度的消耗也相對(duì)比較大,但小于計(jì)數(shù)排序袭景。

??綜合比較唁桩,每個(gè)排序算法各有其特點(diǎn),不同的排序算法適應(yīng)與不同的場(chǎng)景耸棒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荒澡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子与殃,更是在濱河造成了極大的恐慌单山,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幅疼,死亡現(xiàn)場(chǎng)離奇詭異米奸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)爽篷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)悴晰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事铡溪∑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵棕硫,是天一觀的道長(zhǎng)髓涯。 經(jīng)常有香客問(wèn)我,道長(zhǎng)哈扮,這世上最難降的妖魔是什么纬纪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮滑肉,結(jié)果婚禮上包各,老公的妹妹穿的比我還像新娘。我一直安慰自己赦邻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布实檀。 她就那樣靜靜地躺著惶洲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膳犹。 梳的紋絲不亂的頭發(fā)上恬吕,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音须床,去河邊找鬼铐料。 笑死,一個(gè)胖子當(dāng)著我的面吹牛豺旬,可吹牛的內(nèi)容都是我干的钠惩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼族阅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篓跛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起坦刀,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愧沟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鲤遥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沐寺,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盖奈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了混坞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钢坦,死狀恐怖拔第,靈堂內(nèi)的尸體忽然破棺而出咕村,到底是詐尸還是另有隱情,我是刑警寧澤蚊俺,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布懈涛,位于F島的核電站,受9級(jí)特大地震影響泳猬,放射性物質(zhì)發(fā)生泄漏批钠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一得封、第九天 我趴在偏房一處隱蔽的房頂上張望埋心。 院中可真熱鬧,春花似錦忙上、人聲如沸拷呆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茬斧。三九已至,卻和暖如春梗逮,著一層夾襖步出監(jiān)牢的瞬間项秉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工慷彤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娄蔼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓底哗,卻偏偏與公主長(zhǎng)得像岁诉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跋选,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344