マージソート
(マージSORT)をソートマージは古典使用するアルゴリズムソーティング効率的マージの操作に基づいて分割統治(分割統治)戦略(分割を、問題克服点小さなに(除算)次に、再帰的に問題を解決し、ルール(統治)ステージが一緒になって「修復」、すなわち、分割ルールに対する回答の各段階でのポイントを受け取ることになります)、配列が完全かつ整然とした配列を得るために組み合わされた順序付けられた;すなわち、第一各サブシーケンスは、2つの、順序付きリストソートされたリストにマージ方法マージを呼ぶ場合、そのプロモーター配列との間のセグメントを発注し、その後、順序付け
1、基本的な考え方のようなものをマージ
される配列を照合R [0 ... N-1]とNの長さの順序付けられたシーケンス隣接対の順序付けられたリストをマージし、与えるために2 N /長さの2ソートされたリストを;これらの順序付けられたシーケンスを得るために再び合流4 N /長さの4順序付けられたシーケンスを、したがって繰り返しの最終的な長さを与えるために、続けてn個の順序付きシーケンスを
2、説明したマージソートアルゴリズム
(1)「分解」 -ごと配列バイナリ分割を(再帰的)
(2)「マージ」 -配列の分割されたセグメントをソートマージ二十から二後
どのようにマージしますか?
各マージプロセスは、ソート、2つのセグメントの配列が組み合わされて注文しています。
二つのセグメントは、配列R [低、中]、およびR [中間+ 1、高い]を順序付けられます。
最初彼らは、ローカルにマージ一時記憶アレイ合併の完了で、R2、次にR、R2バックコピー。
我々は、第二のセグメントのR [ミッド+ 1、高]、R [低、中間]最初の段落を呼び出します。
二つの部分はそれぞれ、小さなにレコードキーワード比較、R2から採取し、そして最終的には各セグメントの残りの部分は直接R2にコピーします。
このようなプロセスの後、すでにR2は、順序付けられたシーケンスで、その後、マージソートが完了すると、Rに戻って、それをコピーします。
1 / * 最大半分までの配列長さの配列が1分割* /
2 空隙 MergeSort_UptoDown(INT * NUM、int型スタート、INT エンド)
3。 {
4。 INT MID =スタート+(終了-開始])/ 2 ;
5。
6。 IF( > =開始)終了
7。 {
8。 復帰を、
9 }
10
11。 MergeSort_UptoDown(NUM、スタート、MID);
12である MergeSort_UptoDown(NUM、MID + 1 、エンド);
13である
14 (NUM、スタート、MID、エンド)マージ;
15 }
16
。17 空隙マージ(INT * NUMは、int型開始、int型 MID、INT エンド)
18である {
19。 INT * TEMP =(INT *)はmalloc((エンドスタート+ 1)* はsizeof(INT)); // アプリケーションスペース一時記憶領域2つの順序付けられた領域をマージした後
20は int型 I = 開始;
21である INT J = MID + 1 ;
22である 整数 K = 0 、
23である
24 ながら(私は= MID && J <<=エンド)
25 {
26 であれば(NUM [I] <= NUM [J])
27 {
28 温度[K ++] = NUM [I ++ ]。
29 }
30 他の
31 {
32 温度[K ++] = NUM [J ++ ]。
33 }
34 }
35
36 ながら(iは<= MID)
37 {
38 TEMPが[K ++] = NUM [I ++ ]。
39 }
40 ながら(J <= 端)
41 {
42 TEMP [Kが++] = NUM [J ++ ];
43である }
44である
45 // 元の配列に組み込まソーティングステージングエリアの要素
46である ため(I = 0 ; Iは、Kを<; Iは++ )
47 {
48 NUM [スタート+ I] = TEMP [I];
49 }
50
51である フリー(TEMP);
52です }
(出典:HTTPS://www.cnblogs.com/chengxiao/p/6194356.html)
完全なコード:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void MergeSort_UptoDown(int *num, int start, int end); 5 void Merge(int *num, int start, int mid, int end); 6 7 int main() 8 { 9 /* 归并排序(升序) */ 10 int num[10] = {5, 1, 8, 4, 7, 2, 3, 9, 0, 6}; 11 int length = sizeof(num) / sizeof(num[0]); 12 int i; 13 14 MergeSort_UptoDown(num, 0, length - 1); 15 16 for (i = 0; i < length; i++) 17 { 18 printf("%d ", num[i]); 19 } 20 21 return 0; 22 } 23 24 /* 将序列对半拆分直到序列长度为1*/ 25 void MergeSort_UptoDown(int *num, int start, int end) 26 { 27 int mid = start + (end - start) / 2; 28 29 if (start >= end) 30 { 31 return; 32 } 33 34 MergeSort_UptoDown(num, start, mid); 35 MergeSort_UptoDown(num, mid + 1, end); 36 37 Merge(num, start, mid, end); 38 } 39 40 void Merge(int *num, int start, int mid, int end) 41 { 42 int *temp = (int *)malloc((end-start+1) * sizeof(int)); //申请空间来存放两个有序区归并后的临时区域 43 int i = start; 44 int j = mid + 1; 45 int k = 0; 46 47 while (i <= mid && j <= end) 48 { 49 if (num[i] <= num[j]) 50 { 51 temp[k++] = num[i++]; 52 } 53 else 54 { 55 temp[k++] = num[j++]; 56 } 57 } 58 59 while (i <= mid) 60 { 61 temp[k++] = num[i++]; 62 } 63 while (j <= end) 64 { 65 temp[k++] = num[j++]; 66 } 67 68 //将临时区域中排序后的元素,整合到原数组中 69 for (i = 0; i < k; i++) 70 { 71 num[start + i] = temp[i]; 72 } 73 74 free(temp); 75 }