歸併排序的 C 實現

2021-07-05 20:07:07 字數 885 閱讀 8724

首先貼**:

void mergesort(vector&nums, int left, int right)

while (i <= mid) nums[k++] = temp[i++];

while (j <= right) nums[k++] = temp[j++];

}

深感 c++ 是門蛋疼的語言,vector 也好,陣列也好,操作起來就是沒有 python 的 list 靈活方便。

第一次實現的時候,在 mid 這裡出了問題。當時寫的是:

void mergesort(vector&nums, int left, int right)

while (i <= mid - 1) nums[k++] = temp[i++];

while (j <= right) nums[k++] = temp[j++];

}

要知道,如果陣列中有奇數個元素,那麼 mid 正好在中間;如果陣列中有偶數個元素,那麼 mid 其實是指向中間兩個數中較小的那乙個。這樣如果前一半是從 0 到 mid - 1 劃分,後一半是從 mid 到結尾劃分是很不均勻的。所以,必須是從 0 到 mid 劃分,然後從 mid + 1 到結尾劃分兩部分。

nums 一直是以傳址的方式傳遞的,每次呼叫都直接改變它的內容。在內部建立乙個輔助向量,先把 nums 中所有內容複製過去,然後以 nums 為目標把左右兩半的元素複製過去。

還有注意的一點是,面試的時候首先考慮在最開始把遞迴的基本情況先寫出來,再寫遞迴情況。先把整體架構想好,腦子中要視覺化一段向量,怎麼操作的都有個圖形化的概念,這樣**從頭到尾順序擼完,不帶返回去再加乙個變數什麼的,這樣才有水平,給面試官留下深刻印象。

歸併排序 C 實現

歸併排序跟快速排序一樣,也是基於 分治法 歸併排序與快速排序的區別 快速排序是先 分治 成兩個子串行,然後呼叫本身繼續遞迴進行 分治 歸併排序是先遞迴地分成子串行,然後按演算法合併。歸併排序是先遞迴地把待排序序列分成若干子串行,直到最後分成乙個乙個元素為子串行,然後對些子串行中每個元素,依照其大小合...

C 實現歸併排序

歸併 歸併排序 merge sort 是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法 divide and conquer 的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。演算法描...

C 歸併排序實現

基本過程 採用分治的核心思想,把乙個複雜問題拆成若干子問題求解。通過遞迴的方法,不斷對左右兩部分進行拆分 比較左右兩部分大小,不斷將左右兩部分按順序合併 實現 include include using namespace std void merge vector int nums,int low...