归并排序(Merge Sort)基本思想:
将两个或者两个以上的有序表合并为一个新的有序表,即将待排序序列分成若干个子序列,在每个子序列有序的前提下,将子序列合并为整体有序的序列;
举例:
归并排序,先分解成小的序列,对子序列排序,在合并子序列,故其是分治法的典型应用;
重点是如何合并两个有序的子序列。
合并操作:
假设序列data[i......m.......n]是由子序列data[i.......m] 和data[m+1 .......n]合并而来;
1) 令 i = i ;j = m + 1; k = i; i , j , k分别为子序列 ,辅助数组temp[]的下标;
2) 若 i > m 或者 j > n 转到步骤 4); //其中一个子序列已经合并完,比较选取结束;
3) 当 i <= m && j <= n:
若 data[i] < data[j] , 则temp[k++] = temp[i++];
若data[i] > data[j] , 则temp[K++] = temp[j++];
转到步骤 2);
4) //将剩余的某一子序列存入到辅助数组temp
若 i <= m: temp[k...n] = data[i....m] //第一个子序列非空
若 j <= n: temp[k...n] = temp[j......n] //第二个子序列非空
代码实现:
#include<iostream>
#include<queue>
using namespace std;
//-------------------------------------------------------希尔排序 --------------------------------------------------------------------------
void Merge(int* sourceArr , int* targetArr , int startIndex , int midIndex , int endIndex)
{
int j , k;
for(j = midIndex + 1, k = startIndex;startIndex <= midIndex && j <= endIndex; k++)
{
if(sourceArr[startIndex] < sourceArr[j])
targetArr[k] = sourceArr[startIndex++];
else
targetArr[k] = sourceArr[j++];
}
while(startIndex <= midIndex)
targetArr[k++] = sourceArr[startIndex++];
while(j <= endIndex)
targetArr[k++] = sourceArr[j++];
}
void MergeSort(int* sourceArr , int* targetArr , int startIndex , int endIndex)
{
if(sourceArr== NULL || targetArr == NULL ||startIndex > endIndex )
return;
//辅助数组
int tempArr[100];
if(startIndex == endIndex)
{
targetArr[startIndex] = sourceArr[startIndex];
}
else
{
int midIndex = (startIndex + endIndex) / 2;
//递归地将SourceArr[startIndex......midIndex]归并为有序的tempArr[startIndex......midIndex]
MergeSort(sourceArr , tempArr , startIndex , midIndex);
//递归地将SourceArr[midIndex + 1......endIndex]归并为有序的tempArr[midIndex + 1......endIndex]
MergeSort(sourceArr , tempArr , midIndex + 1 , endIndex);
//将有序的序列temp[startIndex....midIndex] 和 temp[midIndex + 1 .....endIndex]
//合并到TargetArr[startIndex.......endIndex]
Merge(tempArr , targetArr , startIndex , midIndex , endIndex);
}
}
int main()
{
int data1[6] = { 2 , 3 , 34 , 0 , 90 , 23 };
int data2[6];
int dLength = sizeof(data1) / sizeof(int);
cout<<"初始数组:";
for(int i = 0; i < dLength; i++)
cout<<data1[i]<<'\t';
cout<<'\n';
cout<<"排序数组:";
MergeSort(data1, data2 , 0 , dLength - 1);
for(int i = 0; i < dLength; i++)
cout<<data2[i]<<'\t';
cout<<endl;
}