歸併排序

歸併排序是將兩個或兩個以上的有序子表合併成一個新的有序表。初始時,把含有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);
	}
	
}
結果:

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