摘要:代碼解析自見文中慢慢理解細(xì)細(xì)入深開辟分配一個(gè)輔助臨時(shí)數(shù)組開辟成功之后實(shí)現(xiàn)歸并之前的劃分?jǐn)?shù)組步驟利用之后立刻釋放空間開辟失敗每一次找中間值依次劃分遞歸劃分后左邊的新一塊遞歸劃分后右邊的一塊合并已劃分排序好的數(shù)組一直為標(biāo)記左半?yún)^(qū)第一個(gè)未排序
代碼解析 自見文中
慢慢理解 細(xì)細(xì)入深
#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){ //開辟分配一個(gè)輔助臨時(shí)數(shù)組 int* temparr = (int*)mallco(sz * sizeof(int)); if (temparr) { //開辟成功之后 實(shí)現(xiàn)歸并之前的劃分?jǐn)?shù)組步驟 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);//合并已劃分排序好的數(shù)組 }}void merge(int arr[], int temparr[], int left, int right, int mid){ //left一直為0 int L_pos = left;//標(biāo)記左半?yún)^(qū)第一個(gè)未排序的數(shù)字 int R_pos = right;//標(biāo)記右半?yún)^(qū)第一個(gè)未排序的數(shù)字 int pos = left;//臨時(shí)數(shù)組的下標(biāo) while (L_pos <= mid && R_pos <= right) { //每次分別把左右半?yún)^(qū)的第一個(gè)元素拿出來(lái)進(jìn)行比較大小 if (arr[L_pos] > arr[R_pos]) { temparr[pos] = arr[R_pos]; pos++; R_pos++; } else { temparr[pos] = arr[L_pos]; pos++; L_pos++; } } //當(dāng)左半?yún)^(qū)排完之后 右半?yún)^(qū)剩余依次放進(jìn)去 while (L_pos <= mid) { temparr[pos] = arr[L_pos]; pos++; L_pos++; } //同理可得 while (R_pos <= right) { temparr[pos] = arr[R_pos]; pos++; R_pos++; } //把臨時(shí)數(shù)組合并后的元素放到原來(lái)的數(shù)組 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;}
祝你好運(yùn)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/121847.html
摘要:兩個(gè)單元素?cái)?shù)組的合并實(shí)際就是對(duì)這兩個(gè)數(shù)進(jìn)行了排序,即變?yōu)椋瑯釉賹?duì)后一組的兩個(gè)數(shù)歸并排序,即變?yōu)椋賹蓡卧獢?shù)組歸并成四單元數(shù)組即和歸并為。 前言 本周講解兩個(gè)50多年前發(fā)明,但今天仍然很重要的經(jīng)典算法 (歸并排序和快速排序) 之一 -- 歸并排序,幾乎每個(gè)軟件系統(tǒng)中都可以找到其中一個(gè)或兩個(gè)的實(shí)現(xiàn),并研究這些經(jīng)典方法的新變革。我們的涉及范圍從數(shù)學(xué)模型中解釋為什么這些方法有效到使這些算法...
摘要:歸并排序就這么簡(jiǎn)單從前面已經(jīng)講解了冒泡排序選擇排序插入排序快速排序了,本章主要講解的是歸并排序,希望大家看完能夠理解并手寫出歸并排序快速排序的代碼,然后就通過(guò)面試了如果我寫得有錯(cuò)誤的地方也請(qǐng)大家在評(píng)論下指出。 歸并排序就這么簡(jiǎn)單 從前面已經(jīng)講解了冒泡排序、選擇排序、插入排序,快速排序了,本章主要講解的是歸并排序,希望大家看完能夠理解并手寫出歸并排序快速排序的代碼,然后就通過(guò)面試了!如果...
摘要:概述歸并排序法是將兩個(gè)或兩個(gè)以上有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。 概述 歸并(Merge)排序法是將兩個(gè)(或兩個(gè)以上)有序表合并成一個(gè)新的有序表,即把待排序序列分為若干個(gè)子序列,每個(gè)子序列是有序的。然后再把有序子序列合并為整體有序序列。 歸并排序采用的是遞歸來(lái)實(shí)現(xiàn),屬于分而治之,將目標(biāo)數(shù)組從中間一分為二,之后分別對(duì)這兩個(gè)數(shù)組進(jìn)行排序,排序...
摘要:排序之歸并排序簡(jiǎn)介歸并排序的算法是將多個(gè)有序數(shù)據(jù)表合并成一個(gè)有序數(shù)據(jù)表。如果參與合并的只有兩個(gè)有序表,則成為二路合并。對(duì)于一個(gè)原始的待排序數(shù)列,往往可以通過(guò)分割的方法來(lái)歸結(jié)為多路合并排序。 Java排序之歸并排序 1. 簡(jiǎn)介 歸并排序的算法是將多個(gè)有序數(shù)據(jù)表合并成一個(gè)有序數(shù)據(jù)表。如果參與合并的只有兩個(gè)有序表,則成為二路合并。對(duì)于一個(gè)原始的待排序數(shù)列,往往可以通過(guò)分割的方法來(lái)歸結(jié)為多路合...
閱讀 3021·2023-04-25 18:00
閱讀 2222·2021-11-23 10:07
閱讀 4060·2021-11-22 09:34
閱讀 1249·2021-10-08 10:05
閱讀 1572·2019-08-30 15:55
閱讀 3435·2019-08-30 11:21
閱讀 3338·2019-08-29 13:01
閱讀 1378·2019-08-26 18:26