摘要:代碼解析自見文中慢慢理解細細入深開辟分配一個輔助臨時數組開辟成功之后實現歸并之前的劃分數組步驟利用之后立刻釋放空間開辟失敗每一次找中間值依次劃分遞歸劃分后左邊的新一塊遞歸劃分后右邊的一塊合并已劃分排序好的數組一直為標記左半區第一個未排序
代碼解析 自見文中
慢慢理解 細細入深
#include#includevoid Print(int arr[], int sz){ int i = 0; for (i = 0; i < sz; i++) { printf("%d", arr[i]); }}void merge_sort(int arr[],int sz){ //開辟分配一個輔助臨時數組 int* temparr = (int*)mallco(sz * sizeof(int)); if (temparr) { //開辟成功之后 實現歸并之前的劃分數組步驟 msort(arr,temparr, 0, sz - 1); //利用之后 立刻釋放空間 free(temparr); } else//開辟失敗 { printf("error:failed to allocate memory"); }}void msort(int arr[],int temparr[] ,int left, int right){ int mid = (left + right) / 2;//每一次找中間值 依次劃分 if(left <= right) { msort(arr,temparr, left,mid);//遞歸劃分后左邊的新一塊 msort(arr,temparr, mid + 1, right);//遞歸劃分后右邊的一塊 merge(arr, temparr, left, right, mid);//合并已劃分排序好的數組 }}void merge(int arr[], int temparr[], int left, int right, int mid){ //left一直為0 int L_pos = left;//標記左半區第一個未排序的數字 int R_pos = right;//標記右半區第一個未排序的數字 int pos = left;//臨時數組的下標 while (L_pos <= mid && R_pos <= right) { //每次分別把左右半區的第一個元素拿出來進行比較大小 if (arr[L_pos] > arr[R_pos]) { temparr[pos] = arr[R_pos]; pos++; R_pos++; } else { temparr[pos] = arr[L_pos]; pos++; L_pos++; } } //當左半區排完之后 右半區剩余依次放進去 while (L_pos <= mid) { temparr[pos] = arr[L_pos]; pos++; L_pos++; } //同理可得 while (R_pos <= right) { temparr[pos] = arr[R_pos]; pos++; R_pos++; } //把臨時數組合并后的元素放到原來的數組 while (left <= right) { //left在這同樣初始為0開始 arr[left] = temparr[left]; left++; }}int main(){ int arr[] = { 9,5,2,7,12,4,3,1,11 }; int sz = sizeof(arr) / sizeof(arr[0]); Print(arr, sz); printf("/n"); merge_sort(arr,sz); Print(arr, sz); return 0;}
祝你好運
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/121847.html
摘要:兩個單元素數組的合并實際就是對這兩個數進行了排序,即變為,同樣再對后一組的兩個數歸并排序,即變為,再將兩單元數組歸并成四單元數組即和歸并為。 前言 本周講解兩個50多年前發明,但今天仍然很重要的經典算法 (歸并排序和快速排序) 之一 -- 歸并排序,幾乎每個軟件系統中都可以找到其中一個或兩個的實現,并研究這些經典方法的新變革。我們的涉及范圍從數學模型中解釋為什么這些方法有效到使這些算法...
摘要:排序之歸并排序簡介歸并排序的算法是將多個有序數據表合并成一個有序數據表。如果參與合并的只有兩個有序表,則成為二路合并。對于一個原始的待排序數列,往往可以通過分割的方法來歸結為多路合并排序。 Java排序之歸并排序 1. 簡介 歸并排序的算法是將多個有序數據表合并成一個有序數據表。如果參與合并的只有兩個有序表,則成為二路合并。對于一個原始的待排序數列,往往可以通過分割的方法來歸結為多路合...
閱讀 3030·2023-04-25 18:00
閱讀 2241·2021-11-23 10:07
閱讀 4085·2021-11-22 09:34
閱讀 1260·2021-10-08 10:05
閱讀 1581·2019-08-30 15:55
閱讀 3451·2019-08-30 11:21
閱讀 3355·2019-08-29 13:01
閱讀 1397·2019-08-26 18:26