歸并排序

導(dǎo)語

歸并排序,顧名思義,先遞歸分解數(shù)列,再進行合并,是分治策略非常典型的應(yīng)用。假設(shè)初始序列含有 n 個元素,則可看做是n個有序的子序列,每個子序列的長度為1, 然后兩兩合并,得到 n/2 個長度為 2 或為 1 的子序列;再兩兩合并,……,如此重復(fù),直至得到一個長度為 n 的有序序列為止。

歸并排序的核心思想是將兩個有序序列合并為一個序列,代碼如下:

void mergeArray(int *array, int first, int middle, int last) {
    int length = last - first + 1;
    int temp[length], i = first, j = middle + 1, k = 0;
    while (i <= middle && j <= last) {
        if(array[i] >= array[j]) {
            temp[k++] = array[j++];
        } else {
            temp[k++] = array[i++];
        }
    }
    
    while (i <= middle) {
        temp[k++] = array[i++];
    }
    
    while (j <= last) {
        temp[k++] = array[j++];
    }
    k = 0;
    for (int t = first; t <= last; t++, k++) {
        array[t] = temp[k];
    }
}

接下來遞歸調(diào)用:

void mergeSort(int *a, int first, int last) {
    if (first < last) {
        int middle = (first + last) / 2;
        mergeSort(a, first, middle);
        mergeSort(a, middle + 1, last);
        mergeArray(a, first, middle, last);
    }
}

最后編輯于
?著作權(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)容

  • 數(shù)據(jù)結(jié)構(gòu)與算法--歸并排序 歸并排序 歸并排序基于一種稱為“歸并”的簡單操作。比如考試可能會分年級排名和班級排名,...
    sunhaiyu閱讀 996評論 0 6
  • 歸并排序 所謂歸并,就是將兩個或兩個以上的有序表合并成一個新的有序表。如下圖所示,有兩個已經(jīng)排好序的有序表A[1]...
    JackChen1024閱讀 2,461評論 0 4
  • 歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非...
    NEXTFIND閱讀 1,048評論 0 0
  • 歸并排序 百度上的解釋:歸并排序:是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide ...
    半月迎風閱讀 722評論 0 4
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,353評論 0 2

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