利用歸并排序進(jìn)行將數(shù)組序列從小到大排序

1 題目

功能:歸并排序

描述:利用歸并排序進(jìn)行將數(shù)組序列從小到大排序

2 思路

歸并排序兩個(gè)或多個(gè)有序記錄序列合并成一個(gè)有序序列一次對(duì)兩個(gè)有序記錄序的歸并稱為二路歸并排序,也有三路歸并排序及多路歸并排序下面代碼給出的是二路歸并排序,基本方法 (1)將n個(gè)記錄看成是n介長(zhǎng)度為1的有序子表 (2)將兩兩相鄰的有序壬莓4行歸并 (3)垂復(fù)軌行步驟(2)直至歸并成一個(gè)長(zhǎng)度為 L 的有序表

3 代碼

#include <stdio.h>

#include <stdlib.h>

/**

功能:歸并排序

描述:利用歸并排序進(jìn)行將數(shù)組序列從小到大排序

**/

voidmerge(intr[],ints[],intx1,intx2,intx3) {// 實(shí)現(xiàn)一次歸并排序函數(shù)

inti,j,k;

i=x1;? ? ? ? ? ? ? ? ? ? // 第一部分的開(kāi)始位置

j=x2+1;? ? ? ? ? ? ? ? ? ? // 第二部分的開(kāi)始位置

k=x1;

while((i<=x2)&&(j<=x3))? ? ? ? // 當(dāng)i和j都在兩個(gè)要合并的部分中

if(r[i]<=r[j]){? ? ? ? ? ? // 篩選兩部分中較小的元素放到數(shù)組s中

s[k]=r[i];

i++;

k++;

}else{

s[k]=r[j];

j++;

k++;

?? }

while(i<=x2)? ? ? ? ? ? ? // 將x1~x2范圍內(nèi)的未比較的數(shù)順次加到數(shù)組r中

s[k++]=r[i++];

while(j<=x3)? ? ? ? ? ? ? // 將x2+1~x3范圍內(nèi)的未比較的數(shù)順次加到數(shù)組r中

s[k++]=r[j++];

}

voidmerge_sort(intr[],ints[],intm,intn) {

intp;

intt[20];

if(m==n)

s[m]=r[m];

else

?? {

p=(m+n)/2;

merge_sort(r,t,m,p);

? ? ? ? ? ? ? ? ? // 遞歸調(diào)用merge_sort函數(shù)將r[m]~r[p]歸并成有序的t[m]~t[p]

merge_sort(r,t,p+1,n);? ? ? // 遞歸調(diào)用merge_sort函數(shù)將r[n+1]~r[n]歸并成有序的t[p+1]~t[n]*/

merge(t,s,m,p,n);? ? ? ? ? // 調(diào)用函數(shù)將前兩部分歸并到s[m]~s[n]

?? }

}

intmain(intargc,charconst*argv[]) {

inta[11];

inti;

printf("請(qǐng)輸入10個(gè)數(shù):\n");

for(i=1;i<=10;i++)

scanf("%d",&a[i]);

merge_sort(a,a,1,10);? ? ? ? ? // 調(diào)用merge_sort函數(shù)進(jìn)行歸并排序

printf("排序后的順序是:\n");

for(i=1;i<=10;i++)

printf("%5d",a[i]);

? printf("\n");

}

示例結(jié)果:

$ gccex063.c-odemo

$ ./demo

請(qǐng)輸入10個(gè)數(shù):

34

12

64

23

98

45

18

52

1

7

排序后的順序是:

171218233445526498

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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