mysql多路歸併排序 C語言歸併排序演算法

2021-10-18 22:11:22 字數 1739 閱讀 5381

用歸併排序法對一組資料由小到大進行排序,資料分別為 695、458、362、789、12、 15、163、23、2、986。

實現過程:

(1) 自定義函式 merge(),實現一次歸併排序。

(2) 自定義函式 merge_sort(),實現歸併排序。

(3) 程式**如下:

#include

int merge(int r,int s,int x1,int x2,int x3) //自定義實現一次歸併樣序的函式

int i,j,k;

i=x1; //第一部分的開始位置

j=x2+1; //第二部分的開始位置

k=x1;

while((i<=x2)&&(j<=x3)) //當i和j都在兩個要合併的部分中時

if(r[i]<=r[j]) //篩選兩部分中較小的元素放到陣列s中

s[k] = r[i];

i++;

k++;

else

s[k]=r[j];

j++;

k++;

while(i<=x2) //將x1〜x2範圍內未比較的數順次加到陣列r中

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

while(j<=x3) //將x2+l〜x3範圍內未比較的數順次加到陣列r中

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

return 0;

int merge_sort(int r,int s,int m,int n)

int p;

int t[20];

if(m==n)

s[m]=r[m];

else

p=(m+n)/2;

merge_sort(r,t,m,p); //遞迴呼叫merge_soit()函式將r[m]〜r[p]歸併成有序的t[m]〜t[p]

merge_sort(r,t,p+1,n); //遞迴一呼叫merge_sort()函式將r[p+l]〜r[n]歸併成有序的t[p+l]〜t[n]

merge(t,s,m,p,n); //呼叫函式將前兩部分歸併到s[m]〜s[n】*/

return 0;

int main()

int a[11];

int i;

printf("請輸入10個數:\n");

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

scanf("%d",&a[i]); //從鍵盤中輸入10個數

merge_sort(a,a,1,10); //呼叫merge_sort()函式進行歸併排序

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

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

printf("%5d",a[i]); //輸出排序後的資料

printf("\n");

return 0;

執行結果:

請輸入10個數:

695 458 362 789 12 15 163 23 2 986

排序後的順序是:

2   12   15   23  163  362  458  695  789  986

技術要點:

歸併是將兩個或多個存序記錄序列合併成乙個有序序列。歸併方法有多種,一次對兩個有序記錄序列進行歸併,稱為路歸併排序,也有三路歸併排序及多路歸併排序。本例項是二路歸併排序,基本方法如下:

(1) 將 n 個記錄看成是 n 個長度為 1 的有序子表。

(2) 將兩兩相鄰時有序無表進行歸併。

(3) 重複執行步驟 (2) 直到歸併成乙個長度為 n 的有序表。

C語言歸併排序

描述 給定乙個數列,用歸併排序演算法把它排成公升序。輸入 第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出 輸出排序後的數列,每個數字佔一行。歸併排序有兩個關鍵點 1.將兩個已經排好序的序列進行合併。歸併2個有序序列為1個有序序列 void merg...

C語言 歸併排序

歸併是將兩個或多個存序記錄序列合併成乙個有序序列。一般來說,一次對幾個有序記錄進行歸併,就稱為幾路歸併排序。以二路歸併排序為例,其基本方法如下 1 將 n 個記錄看成是 n 個長度為 1 的有序子表。2 將兩兩相鄰時有序序列進行歸併。3 重複執行步驟 2 直到歸併成乙個長度為 n 的有序表 如下所示...

C語言歸併排序

include include description 歸併排序 author qingq datetime 2021年3月8日20點03分 int length 待排序陣列長度 int a 待排序陣列 int b 輔助陣列b void mergesort int a,int low,int hig...