#include <bits/stdc++.h>
using namespace std;
int a[10];//定义全局数组
void guibingarry(int a[], int first, int mid,int last, int temp[]){//将有序的两个序列按顺序合并
int i = first; //左半有序区间起点
int j = mid + 1; //右半有序区间起点
int n = mid; //左半有序区间终点
int m = last; //右半有序区间终点
int k = 0; //整个区间的起点相对左半有序区间起点的偏移
while(i <= n&&j <= m) //两个区都未走完
if(a[i]<a[j])temp[k++]=a[i++]; //左区间的值较小,加入到临时数组
else temp[k++] = a[j++]; //否则,把右区间的值入到临时数组
while (i <= n)temp[k++] = a[i++]; //左半区间剩下的数加入到临时数组
while (j <= m)temp[k++] = a[j++]; //右半区间剩下的数加入到临时数组
for(i=0;i<k;i++)a[first+i]=temp[i]; //把临时数组的值赋给原数组
}//注意临时数组的必要性:如果右区间的数全部都比左区间的数小,直接赋给原数组会破坏左半区间,不能给原数组右半区间赋值
void guibingSort(int a[],int first,int last,int temp[]){ //先将序列拆分
if (first < last){ //这个区间有两个数就要排序
int mid = (first+last)/2; //读出中点
guibingSort(a,first,mid,temp); //左区间排序
guibingSort(a, mid + 1, last, temp); //右区间排序
guibingarry(a,first,mid,last,temp); //左右区间合并
}
}
int main(){
for(int i=0;i<10;++i)a[i]=i; //0~9依次赋值
cout << "guibing_Sort:" << endl; //提示语
random_shuffle(a, a + 9); //随机排序
for(int i=0; i<10;++i)cout<<a[i]<<" ";cout << endl; //输出数组
int *p=new int[10];guibingSort(a,0,9,p);delete [] p; //申请临时空间并归并排序
for(int i=0; i<10;++i)cout<<a[i]<<" ";cout << endl; //输出数组
return 0;
}
5排序-2归并排序
最新推荐文章于 2021-03-29 17:20:31 发布