归并排序是将两个或两个以上的有序子表合并成一个新的有序表。初始时,把含有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);
}
}
结果: