ソート - C言語のマージ

マージソート

(マージSORT)をソートマージは古典使用するアルゴリズムソーティング効率的マージの操作に基づいて分割統治(分割統治)戦略(分割を、問題克服小さなに(除算)次に、再帰的に問題を解決し、ルール(統治)ステージが一緒になって「修復」、すなわち、分割ルールに対する回答の各段階でのポイントを受け取ることになります)、配列が完全かつ整然とした配列を得るために組み合わされた順序付けられた;すなわち、第一各サブシーケンスは、2つの、順序付きリストソートされたリストにマージ方法マージを呼ぶ場合、そのプロモーター配列との間のセグメントを発注し、その後、順序付け

 

1、基本的な考え方のようなものをマージ

される配列を照合R [0 ... N-1]とNの長さの順序付けられたシーケンス隣接対の順序付けられたリストをマージし、与えるために2 N /長さの2ソートされたリストを;これらの順序付けられたシーケンスを得るために再び合流4 N /長さの4順序付けられたシーケンスを、したがって繰り返しの最終的な長さを与えるために、続けてn個の順序付きシーケンスを

 

2、説明したマージソートアルゴリズム

最初のステップ:アプリケーションスペース、2つのソート配列の和の大きさ、マージするためのシーケンス記憶空間よう
ステップ2:最初に二つの位置に分類二つのポインタ、配列のそれぞれ開始位置を設定します
第三段階:要素への2つのポインタのポイントを比較するには、比較的小さなスペースに選択された要素は、マージ、および次の位置へのポインタを移動させます
シーケンスのうち末尾ポインタを繰り返しステップ3は、 全ての残りの要素の別の配列を直接配列の終わりにコピーマージ
 
実際には、2つのことを行うためにマージソート:

(1)「分解」 -ごと配列バイナリ分割を(再帰的)

(2)「マージ」 -配列の分割されたセグメントをソートマージ二十から二後

 

どのようにマージしますか

各マージプロセスは、ソート、2つのセグメントの配列が組み合わされて注文しています。

二つのセグメントは、配列R [低、中]、およびR [中間+ 1、高い]を順序付けられます。

最初彼らは、ローカルにマージ一時記憶アレイ合併の完了で、R2、次にR、R2バックコピー。

我々は、第二のセグメントのR [ミッド+ 1、高]、R [低、中間]最初の段落を呼び出します。

二つの部分はそれぞれ、小さなにレコードキーワード比較、R2から採取し、そして最終的には各セグメントの残りの部分は直接R2にコピーします。

このようなプロセスの後、すでにR2は、順序付けられたシーケンスで、その後、マージソートが完了すると、Rに戻って、それをコピーします。

 
図3に示すように、コードの実装
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)* はsizeofINT));     // アプリケーションスペース一時記憶領域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です }
 
図4に示すように、解決プロセス

(出典: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 }
View Code

おすすめ

転載: www.cnblogs.com/lanhaicode/p/11284230.html