归并排序——算法导论学习

归并排序利用分治的思想进行排序,采用递归形式进行排序;

举个栗子:

给一个五个元素的数组,下标从0到4;


把其分为两个部分:0,1,2和3,4 。 两个部分都有序了再合并;

0,1,2再分为两个部分0,1和2      。 两个部分都有序了再合并;

比较0,1,的大小使其有序,2是一个数字,也有序,将这两个有序的合为一个有序的;这样0,1,2有序

比较3,4的大小使其有序,这样0,1,2与3,4都有序,再合并;

总结:归并排序分为以下几个步骤:

1:划分;

2:合并;

将其不断地重复;

引用百科的一张图:


下面在代码中分析:

#include<iostream>
using namespace std;
const int M=1000;
int temp[M];//用于合并的数组 
void merge(int *a,int left,int mid,int right){  // 合并函数 
	int low=left,high=mid+1;
	int x=0;
	while(low<=mid && high<=right){             //比较两个有序段中元素大小,小的先加入,直至一个有序段比较完 
		if(a[low]<a[high])temp[x++]=a[low++];
		else temp[x++]=a[high++];
	}
	while(low<=mid)temp[x++]=a[low++];         //这行与下一行是将未比较完的数组直接加入,因为其有序 
	while(high<=right)temp[x++]=a[high++];     //且大于前面的所有数 
	
	for(int i=0;i<x;i++)a[left+i]=temp[i];     //将其原数组更新 
	
	///输出段:便于理解程序的过程 
	cout<<left<<" "<<right<<"--"<<endl;
	for(int i=0;i<x;i++)cout<<temp[i]<<",";
	cout<<endl;
	///
}
void merge_sort(int *a,int left,int right){
	if(left<right){
		int mid=(left+right)/2;
		merge_sort(a,left,mid);      //划分 
		merge_sort(a,mid+1,right);   //划分
		merge(a,left,mid,right);     //将划分的两部分合并 
	}
}
int main(){
	int a[5]={3,2,1,5,4};
	merge_sort(a,0,4);
	return 0;
} 

运行截图:

即输出段的输出


猜你喜欢

转载自blog.csdn.net/love_phoebe/article/details/78682960
今日推荐