之前所介紹的排序法都是在同乙個陣列中的排序,考慮今日有兩筆或兩筆以上的資料,它可能是不同陣列中的資料,或是不同檔案中的資料,如何為它們進行排序?
可以使用合併排序法,合併排序法基本是將兩筆已排序的資料合併並進行排序,如果所讀入的資料尚未排序,可以先利用其它的排序方式來處理這兩筆資料,然後再將排序好的這兩筆資料合併。
有人問道,如果兩筆資料本身就無排序順序,何不將所有的資料讀入,再一次進行排序?排序的精神是盡量利用資料已排序的部份,來加快排序的效率,小筆資料的 排序較為快速,如果小筆資料排序完成之後,再合併處理時,因為兩筆資料都有排序了,所有在合併排序時會比單純讀入所有的資料再一次排序來的有效率。
那麼可不可以直接使用合併排序法本身來處理整個排序的動作?而不動用到其它的排序方式? 答案是肯定的,只要將所有的數字不斷的分為兩個等分,直到最後剩乙個數字為止,然後再反過來不斷的合併,就如下圖所示:
不過基本上分割又會花去額外的時間,不如使用其它較好的排序法來排序小筆資料,再使用合併排序來的有效率。
下面這個程式範例,我們使用快速排序法來處理小筆資料排序,然後再使用合併排序法處理合併的動作。
#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 ...
漫談經典排序演算法 四 歸併排序 合併排序
這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。各種排序演算法的解析請參考如下 漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線...
漫談經典排序演算法 四 歸併排序 合併排序
這是 漫談經典排序演算法系列 第四篇,解析了歸併排序。漫談經典排序演算法 一 從簡單選擇排序到堆排序的深度解析 漫談經典排序演算法 二 各種插入排序解析及效能比較 漫談經典排序演算法 三 氣泡排序 快速排序 漫談經典排序演算法 四 歸併排序 漫談經典排序演算法 五 線性時間排序 計數 基數 桶排序 ...