數(shù)據(jù)結(jié)構(gòu)與算法(七)宽堆,排序

這節(jié)總結(jié)一下常見的排序算法腌紧。

目錄:

  • 1、插入排序
  • 1.1畜隶、直接插入排序
  • 1.2壁肋、二分插入排序
  • 2号胚、選擇排序
  • 3、冒泡排序
  • 4浸遗、歸并排序
  • 4.1猫胁、自頂向下的歸并排序
  • 4.2、自底向上的歸并排序
  • 5乙帮、希爾排序
  • 6杜漠、快速排序
  • 7极景、堆排序
  • 8察净、性能比較

說(shuō)明:由于對(duì)對(duì)象元素進(jìn)行排序需要實(shí)現(xiàn)Comparable接口,這里為了實(shí)現(xiàn)簡(jiǎn)單盼樟,方便測(cè)試氢卡,僅對(duì)整數(shù)進(jìn)行排序(即排序的對(duì)象為整型數(shù)組)。

1晨缴、插入排序

排序思想:把待排序的元素按其值的大小逐個(gè)插入到一個(gè)已經(jīng)排好序的序列中译秦,直到所有的元素插入完為止。

排序過(guò)程:

1.1击碗、直接插入排序

其代碼如下:

//核心代碼
public void sort(int[] data) {
    int size = data.length;
    for (int i = 1; i < size; i++) {
        for (int j = i; j >= 1 && data[j] < data[j-1]; j--) {
             swap(data, j, j-1);
        }
    }
}

//交換兩個(gè)元素
public void swap(int[] data,int i,int j) {
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

在內(nèi)循環(huán)中將較大的元素一次性向右移動(dòng)而不是交換兩個(gè)元素筑悴,這樣訪問(wèn)數(shù)組的次數(shù)將減半 。其代碼如下:

public void sort(int[] data) {
    int size = data.length;
    for (int i = 1; i < size; i++) {
        int temp = data[i];
        int index = 0; //要插入的位置
        for (int j = i; j >= 1; j--) {
            if (temp < data[j-1]) {
                data[j] = data[j-1];
            }else {
                index = j;
                break;
            }
        }
        data[index] = temp;
    }
}

1.2稍途、二分插入排序

將直接插入排序中尋找a[i]插入位置的方法改為二分查找阁吝,然后再一次性向右移動(dòng)元素。

public void sort(int[] data) {
    int size = data.length;
    for (int i = 1; i < size; i++) {
        int num = binaryFind(data, data[i], 0, i-1);
        int temp = data[i];
        //num后的元素向后移動(dòng)
        for (int j = i; j > num; j--) {
           data[j] = data[j-1];
        }
        data[num] = temp;
    }
}

//找出元素應(yīng)在數(shù)組中插入的位置
public int binaryFind(int[] data, int temp, int down, int up) {
    if(up<down || up>data.length || down<0) {
        System.out.println("下標(biāo)錯(cuò)誤");
    }
    if(temp < data[down]) return down;
    if(temp > data[up]) return up+1;
    int mid = (up-down)/2 + down;
    if(temp == data[mid]) {
        return mid + 1;
    }else if(temp < data[mid]) {
        up = mid-1;
    }else if(temp > data[mid]) {
        down = mid+1;
    }
    return binaryFind(data,temp, down, up);
}

二分插入排序減少了比較次數(shù)械拍,特別是當(dāng)要排序的數(shù)據(jù)很大時(shí)突勇,這個(gè)效果將更加明顯。

2坷虑、選擇排序

排序思想:每一次從待排序的數(shù)據(jù)元素中找出最屑撞觥(或最大)的一個(gè)元素,將它和待排序的元素中第一個(gè)位置的元素進(jìn)行交換迄损,直到全部待排序的數(shù)據(jù)元素排完程為止定躏。

排序過(guò)程:

代碼:

public void sort(int[] data) {
    int size = data.length;
    for(int i=0;i<size;i++) {
        int min = i;
        for(int j=i+1;j<size;j++) {
            if(data[j] < data[min]) 
                min=j;
        }
        swap(data,i,min);
    }
}

//交換兩個(gè)元素
public void swap(int[] data,int i,int j) {
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

3、冒泡排序

排序思想:依次比較相鄰的兩個(gè)元素芹敌,若它們的順序錯(cuò)誤則交換痊远,每次循環(huán)都將最大(或最小)元素放在序列一端党窜。

排序過(guò)程:

代碼:

public void sort(int[] data) {
    int size = data.length;
    for(int i=0; i<size; i++) {
        for(int j=0; j<size-i-1; j++) {
            if(data[j] > data[j+1]) 
                swap(data,j,j+1);
        }
        
    }
}

//交換兩個(gè)元素
public void swap(int[] data,int i,int j) {
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

冒泡排序與選擇排序的區(qū)別:

  • 冒泡排序法是兩兩依次比較拗引,并做交換,交換的次數(shù)多幌衣。
  • 選擇排序法是每次循環(huán)找出最值矾削,循環(huán)結(jié)束后將最值調(diào)整到合適位置壤玫,交換的次數(shù)少。

4哼凯、歸并排序

排序過(guò)程:

4.1欲间、自頂向下的歸并排序

排序思想:要將一個(gè)數(shù)組排序,可以先(遞歸的)將它分為兩半分別排序断部,然后將結(jié)果歸并起來(lái)猎贴。

private int[] array; //輔助數(shù)組
public void sort(int[] data) {
    array = new int[data.length];
    mergeSort(data, 0, data.length - 1);

}

//核心算法
public void mergeSort(int[] data, int down, int up) {
    if (up <= down) return; //結(jié)束條件
    int mid = (up - down) / 2 + down;
    mergeSort(data, down, mid); //左半邊排序
    mergeSort(data, mid + 1, up); //右半邊排序
    merge(data, down, mid, up);
}

//一個(gè)數(shù)組左右半邊分別有序,歸并
public void merge(int[] data, int down, int mid, int up) {
    int i = down, j = mid + 1;
    //復(fù)制數(shù)組中元素
    for (int k = down; k <= up; k++) {
        array[k] = data[k];
    }

    for (int k = down; k <= up; k++) {
        if (i > mid) 
            data[k] = array[j++]; //左半邊用盡蝴光,取右半邊元素
        else if (j > up) 
            data[k] = array[i++];
        else if (array[i] < array[j]) //左半邊元素比右半邊小
            data[k] = array[i++];
        else 
            data[k] = array[j++];
    }
}

對(duì)于自頂向下的歸并排序的改進(jìn):

  • 由于歸并排序的方法調(diào)用過(guò)于頻繁她渴,會(huì)產(chǎn)生過(guò)多的額外開銷,所以歸并排序在處理小規(guī)模問(wèn)題時(shí)蔑祟,比插入排序要慢趁耗。在用歸并排序處理大規(guī)模數(shù)據(jù)時(shí),使用插入排序來(lái)處理小規(guī)模的子數(shù)組疆虚,一般可使歸并排序的運(yùn)行時(shí)間縮短10%-15%苛败。

  • 添加一個(gè)判斷,如果data[mid]小于data[mid+1],則數(shù)組已經(jīng)有序径簿,不需要進(jìn)行歸并操作罢屈。這樣可大大減小有序子數(shù)組的運(yùn)行時(shí)間。

  • 通過(guò)在遞歸調(diào)用的每個(gè)層次交換輸入數(shù)組和輔助數(shù)組的角色篇亭,節(jié)省元素復(fù)制到輔助數(shù)組中的時(shí)間(空間不行)缠捌。即在遞歸中,數(shù)據(jù)從輸入數(shù)組排序到輔助數(shù)組和從輔助數(shù)組排序到輸入數(shù)組交替使用暗赶。

/*
 * 改進(jìn)自頂向下的歸并排序
 * 1. 對(duì)小規(guī)模數(shù)組使用插入排序
 * 2. 加入數(shù)組是否有序的判斷鄙币,減少歸并次數(shù)
 * 3. 通過(guò)在遞歸中交換參數(shù),避免數(shù)組復(fù)制
 */
public class MergeInsSort {
    public static final int CUTOFF = 5; //插入排序處理數(shù)組長(zhǎng)度
    private int[] array;

    public void sort(int[] a) {
        array = a.clone();
        mergeSort(array, a, 0, a.length - 1);

    }

    //核心算法, 對(duì)dst進(jìn)行排序
    public void mergeSort(int[] src, int[] dst, int down, int up) {
        //改進(jìn),小規(guī)模用插入排序,結(jié)束條件
        if (up - down <= CUTOFF) {
            insertionSort(dst, down, up);
            return;
        }
        int mid = (up - down) / 2 + down;
        mergeSort(dst, src, down, mid); //左半邊排序蹂随,交換輸入數(shù)組和輔助數(shù)組角色
        mergeSort(dst, src, mid + 1, up); //右半邊排序十嘿,結(jié)果:src中有序

        if(src[mid] < src[mid + 1]) { //是否已經(jīng)有序
            System.arraycopy(src, down, dst, down, up-down+1);
            return;
        }
        merge(src, dst, down, mid, up);
    }

    //一個(gè)數(shù)組左右半邊分別有序,src歸并到dst
    public void merge(int[] src, int[] dst, int down, int mid, int up) {
        assert isSorted(src, down, mid);  //斷言岳锁,左右半邊均有序
        assert isSorted(src, mid+1,up);

        int i = down, j = mid + 1;
        for (int k = down; k <= up; k++) {
            if (i > mid) dst[k] = src[j++]; //左半邊用盡绩衷,取右半邊元素
            else if (j > up) dst[k] = src[i++];
            else if (src[i] < src[j]) //左半邊元素比右半邊小
                dst[k] = src[i++];
            else dst[k] = src[j++];
        }
        assert isSorted(dst, down, up);
    }

    //插入排序
    public void insertionSort(int[] a, int down, int up) {
        for (int i = down+1; i <= up; i++) {
            for (int j = i; j >= down+1 && a[j] < a[j-1]; j--) {
                swap(a, j, j-1);
            }
        }
    }

/*******************************************************************************/

    //交換兩個(gè)元素
    public void swap(int[] a,int i,int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    
    //判斷down到up的元素是否有序
    public boolean isSorted(int[] a, int down, int up) {
        for (int i = down+1; i <= up; i++) {
            if (a[i] < a[i - 1])
                return false;
        }
        return true;
    }
}

4.2、自底向上的歸并排序

排序思想:先兩兩歸并(把每個(gè)元素當(dāng)成一個(gè)長(zhǎng)度為1的數(shù)組)激率,在四四歸并咳燕,然后八八歸并,一直下去乒躺。每輪歸并中最后一次歸并的第二個(gè)數(shù)組可能比第一個(gè)姓忻ぁ(注意不要越界)。

private int[] array; //輔助數(shù)組

public void sort(int[] a) {
    array = new int[a.length];
    mergeSort(a);
}

//核心算法
public void mergeSort(int[] a) {
    int N = a.length;
    for (int i = 1; i < N; i = 2 * i) {
        for (int j = 0; j < N - i; j += 2 * i)
            merge(a, j, j + i - 1, Math.min(j + 2 * i - 1, N - 1));
    }
}

//一個(gè)數(shù)組左右半邊分別有序嘉冒,歸并
public void merge(int[] a, int down, int mid, int up) {
    int i = down, j = mid + 1;
    //復(fù)制數(shù)組中元素
    for (int k = down; k <= up; k++) {
        array[k] = a[k];
    }

    for (int k = down; k <= up; k++) {
        if (i > mid) a[k] = array[j++]; //左半邊用盡曹货,取右半邊元素
        else if (j > up) a[k] = array[i++];
        else if (array[i] < array[j]) //左半邊元素比右半邊小
            a[k] = array[i++];
        else a[k] = array[j++];
    }
}

5咆繁、希爾排序

排序思想:交換不相鄰的元素以對(duì)數(shù)組的局部進(jìn)行排序,并最終用插入排序?qū)⒕植坑行虻臄?shù)組排序顶籽。使數(shù)組中任意間隔為h的元素都是有序的玩般。其中h為任意以1結(jié)尾的整數(shù)序列。

希爾排序的執(zhí)行時(shí)間依賴于增量序列h礼饱,好的增量序列的共同特征:

  • 最后一個(gè)增量必須為1坏为;
  • 應(yīng)該盡量避免序列中的值(尤其是相鄰的值)互為倍數(shù)的情況。

排序過(guò)程:

希爾排序比插入排序要快的多镊绪,并且數(shù)組越大匀伏,優(yōu)勢(shì)越大。

代碼:

//核心算法镰吆,增量序列 1 4 13 ....(3*h+1)
public void sort(int[] data) {
    int size = data.length;
    int h = 1;
    while(h < size/3) 
        h = 3*h + 1;
    while(h > 0 ) {
        //插入排序帘撰,間隔h
        for(int i=h; i<size; i++) {
            for(int j=i; j>=h && data[j] < data[j-h]; j = j-h) {
                swap(data, j, j-h);
            }
        }
        h = h/3;
    }

}

//交換兩個(gè)元素
public void swap(int[] data,int i,int j) {
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

6跑慕、快速排序

排序思想:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)切分成獨(dú)立的兩部分万皿,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序核行,整個(gè)排序過(guò)程可以遞歸進(jìn)行牢硅,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

切分過(guò)程:

取數(shù)組中第一個(gè)元素作為切分元素V芝雪,從數(shù)組的左端開始向右掃描直達(dá)找到一個(gè)大于等于V的元素减余,再?gòu)臄?shù)組右端向左掃描直到找到一個(gè)小于等于V的元素,交換他們的位置惩系。如此繼續(xù)位岔,保證左指針左側(cè)的元素都小于等于V,右指針右側(cè)的元素都大于等于V堡牡。直到兩個(gè)指針相遇抒抬,將V和左子數(shù)組最右側(cè)元素交換,返回j

排序過(guò)程:

public void sort(int[] data) {
    sort(data, 0, data.length - 1);
}

//核心算法
public void sort(int[] data, int down, int up) {
    if(up <= down)
        return;
    
    int temp = partition(data, down, up); //找到切分點(diǎn)
    sort(data, down, temp - 1); //左半邊排序
    sort(data, temp + 1, up);  //右半邊排序
}

//切分
public int partition(int[] data, int down, int up) {
    int i = down;
    int j = up + 1;
    int v = data[down]; //使用data[down]作為切分元素
    while (true) {
        while (data[++i] < v) {
            if (i == up) 
                break;
        }

        while (v < data[--j]) {
            if (j == down) 
                break;
        }

        if (i >= j) break;
        swap(data, i, j);
    }
    swap(data, down, j);
    return j;
}

//交換兩個(gè)元素
public void swap(int[] data, int i, int j) {
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

快速排序的改進(jìn):

快速排序切分不平衡時(shí)可能會(huì)非常低效晤柄,如:第一次以最小的元素切分擦剑,第二次以第二小的元素切分,如此芥颈,每次調(diào)用只會(huì)移動(dòng)一個(gè)元素惠勒,這將使快速排序退化為冒泡排序。所以快速排序前要將數(shù)組進(jìn)行隨機(jī)排序爬坑,打亂其順序纠屋。另外對(duì)于小規(guī)模數(shù)組,可以使用插入排序來(lái)提高排序的性能盾计。原因和歸并排序時(shí)一樣售担。

改進(jìn)后的代碼:

//使用插入排序的闕值
public static final int CUTOFF = 5;
public void sort(int[] data) {
    shuffle(data); //打亂數(shù)組肉康,消除對(duì)輸入的依賴
    sort(data, 0, data.length - 1);
}

public void sort(int[] data, int down, int up) {
    //小規(guī)模時(shí)用插入排序
    if (up - down <= CUTOFF) {
        insertionSort(data, down, up);
        return;
    }
    
  //大規(guī)模時(shí)使用快速排序
    int temp = partition(data, down, up); //切分
    sort(data, down, temp - 1); //左半邊排序
    sort(data, temp + 1, up);  //右半邊排序
}

//切分
public int partition(int[] data, int down, int up) {
    int i = down;
    int j = up + 1;
    while (true) {
        //使用data[down]作為切分元素
        while (data[++i] < data[down]) {
            if (i == up) 
                break;
        }

        while (data[down] < data[--j]) {
            if (j == down) 
                break;
        }

        if (i >= j) break;
        swap(data, i, j);
    }
    swap(data, down, j);
    return j;
}

//插入排序
public void insertionSort(int[] data, int down, int up) {
    for (int i = down + 1; i <= up; i++) {
        for (int j = i; j >= down + 1 && data[j] < data[j - 1]; j--) {
            swap(data, j, j - 1);
        }
    }
}

//交換兩個(gè)元素
public void swap(int[] data, int i, int j) {
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

//隨機(jī)打亂數(shù)組
public static void shuffle(int[] data) {
    int N = data.length;
    Random rand = new Random();
    for (int i = 0; i < N; i++) {
        int r = i + rand.nextInt(N-i);     // between i and N-1
        int temp = data[i];
        data[i] = data[r];
        data[r] = temp;
    }
}

7、堆排序

排序思想:利用堆的有序性(根節(jié)點(diǎn)最大)來(lái)進(jìn)行排序灼舍,每次從堆中取出根節(jié)點(diǎn)吼和,并保持堆有序。

如果對(duì)堆這種數(shù)據(jù)結(jié)構(gòu)不太了解的話骑素,可以先看我的另一篇博客《數(shù)據(jù)結(jié)構(gòu)與算法(五)炫乓,優(yōu)先隊(duì)列》。

這里需要注意:這篇博客中實(shí)現(xiàn)的堆是從數(shù)組中下標(biāo)為0的位置開始的献丑,所以結(jié)點(diǎn)k的子結(jié)點(diǎn)下標(biāo)分別為2k+1和2k+2末捣,這和在《數(shù)據(jù)結(jié)構(gòu)與算法(五),優(yōu)先隊(duì)列》中的堆實(shí)現(xiàn)有些不同创橄。

排序過(guò)程:

代碼:

public void sort(int[] data) {
    int N = data.length-1;
    for(int k = (N-1)/2; k>=0; k--) {
        sink(data, k, N); //使堆有序
    }
    
    //將最大元素放到最后
    while(N > 0) {
        swap(data, 0, N--);
        sink(data, 0, N);
    }
}

//下沉操作箩做,從下標(biāo)0開始
private void sink(int[] data, int k, int N) {
    while(2*k+1 <= N) {
        int j = 2*k+1;
        if(j < N && data[j] < data[j+1])
            j++;
        if(data[k] >= data[j])
            break;
        swap(data, k, j);
        k = j;
    }
}

//交換兩個(gè)元素
public void swap(int[] data, int i, int j) {
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}

8、性能比較

說(shuō)明:這里只比較通用的實(shí)現(xiàn)方法妥畏,而不會(huì)對(duì)排序方法的改進(jìn)版本進(jìn)行比較邦邦。

排序的穩(wěn)定性:

假定在待排序的記錄序列中,存在多個(gè)具有相同的關(guān)鍵字的記錄醉蚁,若經(jīng)過(guò)排序燃辖,這些記錄的相對(duì)次序保持不變,即在原序列中网棍,ri=rj黔龟,且ri在rj之前,而在排序后的序列中滥玷,ri仍在rj之前氏身,則稱這種排序算法是穩(wěn)定的;否則稱為不穩(wěn)定的惑畴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蛋欣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桨菜,更是在濱河造成了極大的恐慌豁状,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倒得,死亡現(xiàn)場(chǎng)離奇詭異泻红,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)霞掺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門谊路,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人菩彬,你說(shuō)我怎么就攤上這事缠劝〕碧荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵惨恭,是天一觀的道長(zhǎng)秉馏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)脱羡,這世上最難降的妖魔是什么萝究? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮锉罐,結(jié)果婚禮上帆竹,老公的妹妹穿的比我還像新娘。我一直安慰自己脓规,他們只是感情好栽连,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侨舆,像睡著了一般秒紧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上态罪,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天噩茄,我揣著相機(jī)與錄音,去河邊找鬼复颈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沥割,可吹牛的內(nèi)容都是我干的耗啦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼机杜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帜讲!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起椒拗,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤似将,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蚀苛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體在验,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年堵未,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腋舌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渗蟹,死狀恐怖块饺,靈堂內(nèi)的尸體忽然破棺而出赞辩,到底是詐尸還是另有隱情,我是刑警寧澤授艰,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布辨嗽,位于F島的核電站,受9級(jí)特大地震影響淮腾,放射性物質(zhì)發(fā)生泄漏召庞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一来破、第九天 我趴在偏房一處隱蔽的房頂上張望篮灼。 院中可真熱鬧,春花似錦徘禁、人聲如沸诅诱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娘荡。三九已至,卻和暖如春驶沼,著一層夾襖步出監(jiān)牢的瞬間炮沐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工回怜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留大年,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓玉雾,卻偏偏與公主長(zhǎng)得像翔试,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子复旬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • 概述 排序有內(nèi)部排序和外部排序垦缅,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大驹碍,一次不能容納全部...
    蟻前閱讀 5,191評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序壁涎,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大志秃,一次不能容納全部...
    每天刷兩次牙閱讀 3,733評(píng)論 0 15
  • 一怔球、 單項(xiàng)選擇題(共71題) 對(duì)n個(gè)元素的序列進(jìn)行冒泡排序時(shí),最少的比較次數(shù)是( )洽损。A. n ...
    貝影閱讀 9,093評(píng)論 0 10
  • 想聽小曲兒庞溜,請(qǐng)點(diǎn)擊下方藍(lán)色歌名。 〔忘憂草〕 口琴小吹19【淡淡的歌】 口琴小吹21【前前前世】
    至簡(jiǎn)從心閱讀 1,121評(píng)論 22 34
  • 鍥子 初春的太陽(yáng)不熱烈但和煦。 林暖站在B大的門口久久不能緩過(guò)神來(lái)流码,“B大又官,是B大!”林暖夢(mèng)想三年的...
    灣圓閱讀 273評(píng)論 0 0