マージソートとC ++ソースコード実装の原則


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. 最初のグループ化:{1,4}、{2,6}、{7,3}、{5,10}、{9}、マージ後、{1,4}、{2,6}、{3 、7}、{5,10}、{9}
  2. 2番目のグループ化:{1,4,2,6}、{3,7,5,10}、{9}、マージ後、{1,2,4,6}、{3、5,7,10}、 {9}
  3. 3番目のグループ化:{1,2,4,6,3、5,7,10}、{9}、マージ後、{1,2,3,4,5,6,7,10}、{ 9}
  4. 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);
}

おすすめ

転載: blog.csdn.net/locahuang/article/details/110181499
おすすめ