归并排序

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章