C 經典演算法題 合併排序法

2021-10-02 06:24:24 字數 2534 閱讀 6131

之前所介紹的排序法都是在同乙個陣列中的排序,考慮今日有兩筆或兩筆以上的資料,它可能是不同陣列中的資料,或是不同檔案中的資料,如何為它們進行排序?

可以使用合併排序法,合併排序法基本是將兩筆已排序的資料合併並進行排序,如果所讀入的資料尚未排序,可以先利用其它的排序方式來處理這兩筆資料,然後再將排序好的這兩筆資料合併。

有人問道,如果兩筆資料本身就無排序順序,何不將所有的資料讀入,再一次進行排序?排序的精神是盡量利用資料已排序的部份,來加快排序的效率,小筆資料的 排序較為快速,如果小筆資料排序完成之後,再合併處理時,因為兩筆資料都有排序了,所有在合併排序時會比單純讀入所有的資料再一次排序來的有效率。

那麼可不可以直接使用合併排序法本身來處理整個排序的動作?而不動用到其它的排序方式? 答案是肯定的,只要將所有的數字不斷的分為兩個等分,直到最後剩乙個數字為止,然後再反過來不斷的合併,就如下圖所示:

不過基本上分割又會花去額外的時間,不如使用其它較好的排序法來排序小筆資料,再使用合併排序來的有效率。

下面這個程式範例,我們使用快速排序法來處理小筆資料排序,然後再使用合併排序法處理合併的動作。

#include

#include

#include

#define max1 10

#define max2 10

#define swap(x,y)

intpartition

(int

,int

,int);

void

quicksort

(int

,int

,int);

void

mergesort

(int

,int

,int

,int

,int

);intmain

(void);

int number2[max1]=;

int number3[max1+max2]=;

int i, num;

srand

(time

(null))

;printf

("排序前:");

printf

("\nnumber1:");

for(i =

0; i < max1; i++

)printf

("\nnumber2:");

for(i =

0; i < max2; i++

)// 先排序兩筆資料

quicksort

(number1,

0, max1-1)

;quicksort

(number2,

0, max2-1)

;printf

("\n 排 序 後 :");

printf

("\nnumber1:");

for(i =

0; i < max1; i++

)printf

("%d "

, number1[i]);

printf

("\nnumber2:");

for(i =

0; i < max2; i++

)printf

("%d "

, number2[i]);

// 合併排序

mergesort

(number1, max1, number2, max2, number3)

;printf

("\n合併後:");

for(i =

0; i < max1+max2; i++

)printf

("%d "

, number3[i]);

printf

("\n");

return0;

}int

partition

(int number,

int left,

int right)

}swap

(number[i+1]

, number[right]);

return i+1;

}void

quicksort

(int number,

int left,

int right)

}void

mergesort

(int number1,

int m,

int number2,

int n,

int number3)

number3[k++

]= number2[j++];

while

(i < m)

number3[k++

]= number1[i++];

while

(j < n)

number3[k++

]= number2[j++];

}

分治法合併排序(C )

參考 include include include using namespace std 合併函式 void merge int arr,int p,int q,int r for int j 0 j len2 j l len1 r len2 int max 定義無窮大 int i 0,j 0 ...

漫談經典排序演算法 四 歸併排序 合併排序

這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。各種排序演算法的解析請參考如下 漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線...

漫談經典排序演算法 四 歸併排序 合併排序

這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線性時間排序 計數 基數 桶排序 ...