归并排序利用分治的思想进行排序,采用递归形式进行排序;
举个栗子:
给一个五个元素的数组,下标从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;
}
运行截图:
即输出段的输出