歸併排序是將兩個或兩個以上的有序子表合併成一個新的有序表。初始時,把含有n個結點的待排序序列看作由n個長度都爲1的有序子表組成,將它們依次兩兩歸併得到長度爲2的若干有序子表,再對它們兩兩合併。直到得到長度爲n的有序表,排序結束。
歸併操作的工作原理如下:
1、申請空間,使其大小爲兩個已經排序序列之和,該空間用來存放合併後的序列
2、設定兩個指針,最初位置分別爲兩個已經排序序列的起始位置
3、比較兩個指針所指向的元素,選擇相對小的元素放入到合併空間,並移動指針到下一位置
4、重複步驟3直到某一指針達到序列尾
5、將另一序列剩下的所有元素直接複製到合併序列尾
// 歸併排序.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void mergeSort(int a[],int low,int high);
void merge(int a[],int low,int mid,int high);
int main()
{
int array[]={3,7,1,5,4};
int length=sizeof(array)/sizeof(int);
cout<<"before sort"<<endl;
for(int i=0;i<length-1;i++)
{
cout<<array[i]<<' ';
}
cout<<array[length-1]<<endl;
mergeSort(array,0,length);
cout<<"after sort"<<endl;
for(int i=length-1;i>=0;i--)
{
cout<<array[i]<<' ';
}
cout<<endl;
return 0;
}
void merge(int a[],int low,int mid,int high)
{
int n1=mid-low+1;
int n2=high-mid;
vector<int>left(n1);
vector<int>right(n2);
for(int i=0;i<n1;i++)
{
left[i]=a[low+i];
}
for(int i=0;i<n2;i++)
{
right[i]=a[mid+i+1];
}
int i=0;
int j=0;
int k=low;
while(i<n1&&j<n2)
{
if(left[i]>right[j])
{
a[k++]=left[i++];
}
else
{
a[k++]=right[j++];
}
}
while(i<n1)
{
a[k++]=left[i++];
}
while(j<n2)
{
a[k++]=right[j++];
}
}
void mergeSort(int a[],int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
mergeSort( a,low,mid);
mergeSort( a,mid+1,high);
merge(a,low,mid,high);
}
}
結果: