算法思想:https://www.cnblogs.com/chengxiao/p/6194356.html
代码实现:https://www.cnblogs.com/skywang12345/p/3602369.html
无注释版
#include<iostream>
#include<stdlib.h>
using namespace std;
void merge_sort(int *a,int start,int mid,int end){
int i=start;
int j=mid+1;
int k=0;
int *temp=(int*)malloc((end-start+1)*sizeof(int));
while(i<=mid&&j<=end){
if(a[i]<a[j]){
temp[k++]=a[i++];
}else{
temp[k++]=a[j++];
}
}
while(i<=mid){
temp[k++]=a[i++];
}
while(j<=end){
temp[k++]=a[j++];
}
// 将排序后的元素,全部都整合到数组a中。
for (i = 0; i < k; i++)
a[start + i] = temp[i];
free(temp);
}
void merge_split(int *a,int start,int end){
if(a==NULL||start>=end)
return;
int mid=(start+end)/2;
merge_split(a,start,mid);
merge_split(a,mid+1,end);
merge_sort(a,start,mid,end);
}
int main(){
int a[10]={1,2,88,59,14,89,71,0,9,50};
merge_split(a,0,9);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
return 0;
}
有注释版
//归并排序
#include<iostream>
#include<stdlib.h >
using namespace std;
/*
* 将一个数组中的两个相邻有序区间合并成一个
*
* 参数说明:
* a -- 包含两个有序区间的数组
* start -- 第1个有序区间的起始地址。
* mid -- 第1个有序区间的结束地址。也是第2个有序区间的起始地址。
* end -- 第2个有序区间的结束地址。
*/
void merge(int a[], int start, int mid, int end)
{
int *tmp = (int *)malloc((end-start+1)*sizeof(int)); // tmp是汇总2个有序区的临时区域
int i = start; // 第1个有序区的索引
int j = mid + 1; // 第2个有序区的索引
int k = 0; // 临时区域的索引
while(i <= mid && j <= end)
{
if (a[i] <= a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while(i <= mid)
tmp[k++] = a[i++];
while(j <= end)
tmp[k++] = a[j++];
// 将排序后的元素,全部都整合到数组a中。
for (i = 0; i < k; i++)
a[start + i] = tmp[i];
free(tmp);
}
/*
* 归并排序(从上往下)
*
* 参数说明:
* a -- 待排序的数组
* start -- 数组的起始地址
* endi -- 数组的结束地址
*/
void merge_sort_up2down(int a[], int start, int end)
{
if(a==NULL || start >= end)
return ;
int mid = (end + start)/2;
merge_sort_up2down(a, start, mid); // 递归排序a[start...mid]
merge_sort_up2down(a, mid+1, end); // 递归排序a[mid+1...end]
// a[start...mid] 和 a[mid...end]是两个有序空间,
// 将它们排序成一个有序空间a[start...end]
merge(a, start, mid, end);
}
int main(){
int a[8]={87,97,2,34,42,31,87,65};
merge_sort_up2down(a,0,7);
for(int i=0;i<8;i++)
cout<<a[i]<<" ";
return 0;
}