1.原則
分割統治法を使用して最初に各サブシーケンスを順序付けし、次に順序付けられたサブシーケンスをマージして完全に順序付けられたシーケンスを取得する、マージ操作に基づく効果的で安定したアルゴリズム。2つの順序付きリストを1つの順序付きリストに結合すると、双方向のマージになります。
アイデアを並べ替えます。1つは2つに分割され、2つは4つに分割され、4つは8つに分割され、分割が最小になるまで、徐々にマージされます。分割時には再帰的方法を採用しています。
2.考える
最初に元のシーケンスをグループ化し、それを複数のサブシーケンスに分割し、各サブシーケンスを並べ替え、次にサブシーケンスをペアごとにマージして並べ替え、次のマージされたサブシーケンスとして新しい順序付けられたシーケンスを取得し、新しいサブシーケンスをマージします。このループでは、順序付けられたシーケンスが取得されます。
例:
データのマージと並べ替え[1、4、2、6、7、3、5、10、9]。
初期状態:1、4、2、6、7、3、5、10、9
- 最初のグループ化:{1,4}、{2,6}、{7,3}、{5,10}、{9}、マージ後、{1,4}、{2,6}、{3 、7}、{5,10}、{9}
- 2番目のグループ化:{1,4,2,6}、{3,7,5,10}、{9}、マージ後、{1,2,4,6}、{3、5,7,10}、 {9}
- 3番目のグループ化:{1,2,4,6,3、5,7,10}、{9}、マージ後、{1,2,3,4,5,6,7,10}、{ 9}
- 4番目のグループ化:{1,2,3,4,5,6,7,10,9}、マージ後、[1,2,3,4,5,6,7,9,10]を取得します。
3つ、マージソートの特性
-
安定したソート、等しい要素の順序は変わりません。例えば、レコード1(a)3(b)2(c)2(d)5(e)(レコードのキーは括弧内)を入力する場合、出力1(a)2(c)2(d) 3(b))5(e)の2と2は入力順になっています。これは、並べ替えるデータに複数の情報が含まれていて、そのうちの1つで並べ替える必要があり、その他の情報を配置する必要がある場合に非常に重要です。可能な限り入力順に。
-
マージソートの比較数はクイックソートよりも少なく、移動数は一般的にクイックソートよりも多くなります。
4、C ++ソースコードの実装
分割が完了したら、分割データを並べ替える必要があります。この時点で、マージ関数には合計5つのパラメーター
sort(int * data、int * temp、int start、int middle、int end)があります。ここでは一時変数です。変数tempが使用されます2つのソートされたセットの中間変数として、セットが合成されます。
void merge(int arr[], int *temp, int start, int middle, int end)
{
int i=start, j=middle+1,k=start;
while(i<=middle && j<=end)
{
if(arr[j] < arr[i])
{
temp[k++]=arr[j++];
}
else
{
temp[k++]=arr[i++]
}
}
/*
这里表示的是几集合2的数值已经先排序完成,集合1剩下有数据剩余,
这个时候直接把集合1剩余的数据直接插入到合集的后面,比如两个集合,
集合1:1 3 8 9, 集合2:2 4 6 7,集合1和集合2的合集到1 2 3 4 6 7,
此时集合2内的数据已经合并完毕,集合1还有8 9 数据,这个时候直接追加到合集中即可
*/
while(i <= middle)
{
temp[k++]=arr[i++];
}
//与上while类似,只是这里剩余的是集合2的数据
while(j<=end)
{
temp[k++]=arr[j++];
}
//把临时变量中的数值拷贝到数组中
for(i=start; i <=end; i++)
{
arr[i]=temp[i];
}
}
//start,end参数均为数值的下标值
void mergeSort(int arr[], int *temp, int start, int end)
{
int middle=0;
if(start< end)
{
middle=start+(end-start)/2;
mergeSort(arr, temp, start, middle);
mergeSort(arr, temp, middle+1, end);
merge(arr, temp, start, middle, end);
}
}
//调用函数
int main()
{
int arr[9]={
1,4,2,6,7,3,5,10,9};
int temp[9]={
0};
int len=9;
mergeSort(arr, temp, 0, len-1);
}