日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

归并排序及C语言实现

發(fā)布時間:2025/4/16 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 归并排序及C语言实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

排序系列之(1)歸并排序及C語言實現(xiàn)

有很多算法在結(jié)構(gòu)上是遞歸的:為了解決一個給定的問題,算法需要一次或多次遞歸的調(diào)用其本身來解決相關(guān)的問題。這些算法通常采用分治策略:將原問題劃分成n個規(guī)模較小而結(jié)構(gòu)與原問題相似的子問題;遞歸的解決這些子問題,然后將結(jié)果合并,就能得到原問題的解。

分治模式在遞歸時一般都有三個步驟

分解:將原問題分解成一系類子問題

解決:遞歸的解各子問題。若子問題足夠小,則直接求解。

合并:將子問題的結(jié)果合并成原問題的解。

歸并排序在算法上完全依照了上述模式,操作如下。

分解:將n個元素分解成n/2個元素的子序列

解決:用合并排序法對兩個子序列遞歸地排序

合并:將子問題的結(jié)果合并原問題的解。

以下是源代碼實現(xiàn)

view plaincopy to clipboardprint?
void mergeSort(int a[],int left,int right)??
{??
??? int i;??
??? // 保證至少有兩個元素??
??? if(left < right)??
??? {??
??????? i = (left+right)/2;??
??????? mergeSort(a,left,i);??
??????? mergeSort(a,i+1,right);??
??????? merge(a,left,right);??
??? }??
}??
?
void merge(int a[],int left,int right)??
{??
??? int begin1 = left;??
??? int mid = (left+right)/2 ;??
??? int begin2 = mid+1;??
??? int k=0;??
??? int newArrayLen = right-left+1;??
??? int *b = (int*)malloc(newArrayLen*sizeof(int));??
??? while(begin1<=mid && begin2<=right)??
??? {??
??????? if(a[begin1]<=a[begin2])??
??????????? b[k++] = a[begin1++];??
??????? else?
??????????? b[k++] = a[begin2++];??
??? }??
??? while(begin1<=mid)??
??????? b[k++] = a[begin1++];??
??? while(begin2<=right)??
??????? b[k++] = a[begin2++];??
??? copyArray(b,a,newArrayLen,left);??
??? free(b);??
}??
?
/**?
?* 復制數(shù)組?
?* source:源數(shù)組?
?* dest:目標數(shù)組?
?* len:源數(shù)組長度?
?* first:目標數(shù)組起始位置?
?*?
?*/?
void copyArray(int source[], int dest[],int len,int first)??
{??
??? int i;??
??? int j=first;??
??? for(i=0;i<len;i++)??
??? {??
??????? dest[j] = source[i];??
??????? j++;??
??? }??
??????????
}??
void mergeSortTest()??
{??
??? int a[] = {5, 18, 151, 138, 160, 63, 174, 169, 79, 200};??
??? int len = sizeof(a)/sizeof(int);??
??? showArray(a,len);??
??? mergeSort(a,0,len-1);?????
??? showArray(a,len);??
??????
}?

?

本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/taizhoufox/archive/2010/10/13/5938487.aspx

總結(jié)

以上是生活随笔為你收集整理的归并排序及C语言实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。