5排序-2归并排序

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值