数据结构 — 归并排序

一、归并排序算法

1、归并:将两个以上的顺序表合并成一个新的有序表。

2、归并排序:假设有n个记录,看成n个有序序列(每个序列的长度是1),将其两两有序合并成 n/2 个含有两个或者一个元素的有序序列,之后不断重复合并这个动作,直至合并成一个含有n个元素的有序序列。

(引用大话数据结构中的排序树)






二、递归实现

#include<iostream>
using namespace std;

#define max_size 16

void merge(int list2[] ,int ans[], int lower, int middle,int upper);
void mergeSort(int list[], int ans[], int lower, int upper);


/*
 * 将list2中的所有元素按照 lower,middle,upper, 分为两组,归并到 ans
 */
void merge(int list2[] ,int ans[], int lower, int middle,int upper) {
    int i, j, k;
    i = k = lower;
    j = middle + 1;
    while(i <= middle && j <= upper) {
        if(list2[i]<list2[j]) {
            ans[k++] = list2[i++]; 
        } else {
            ans[k++] = list2[j++];
        }   
    }
    if(i <= middle) {
        for(int l = 0; l <= middle-i; l++) {
            ans[k++] = list2[i+l];
        }
    }
    if(j <= upper) {
        for(int l = 0; l <= upper-j; l++) {
            ans[k++] = list2[j+l];
        }
    }
}
/*
 * 归并排序
 * 1.将list 按照 middle 分成两组 分别存在 list2 中
 * 2.将 list2 的 两个分组 归并到 ans
 */
void mergeSort(int list[], int ans[], int lower, int upper) {
    int list2[max_size];
    int middle;
    if(lower == upper) {	
        ans[lower] = list[lower];
    } else {
        middle = (lower + upper)/2;
        mergeSort(list, list2, lower, middle);
        mergeSort(list, list2, middle+1, upper);
        merge(list2, ans, lower, middle, upper);
    }
}

   int main() {
       int list[max_size];
       int ans[max_size];
       list[0] = 16;
       list[1] = 7;
       list[2] = 13;
       list[3] = 10;
       list[4] = 9;
       list[5] = 15;
       list[6] = 3;
       list[7] = 2;
       list[8] = 5;
       list[9] = 8;
       list[10] = 12;
       list[11] = 1;
       list[12] = 11;
       list[13] = 4;
       list[14] = 6;
       list[15] = 14;
 	   for(int i = 0; i<max_size; i++) {
           cout<<list[i]<<" ";
        //   ans[i] = list[i];
       }
       cout<<endl;
       mergeSort(list, ans, 0, max_size-1);
       for(int i = 0; i<max_size; i++) {
           cout<<ans[i]<<" ";
       }
       cout<<endl;
       return 0;
   }




3、非递归实现

#include<iostream>
using namespace std;
#define max_size 16

const int n = max_size;

void merge(int list[], int sorted[], int lower, int middle, int upper) {
    int i,j,k;
    i = k = lower;
    j = middle + 1;

    while(i<=middle && j<=upper) {
        if(list[i]<=list[j]) {
            sorted[k++] = list[i++];
        } else {
            sorted[k++] = list[j++];
        }
    }
    if(i > middle){
        for(int t = 0; t<=upper-j; t++) {
            sorted[k++] = list[j+t];
        } 
    } else {
        for(int t = 0; t<=middle-i; t++) {
            sorted[k++] = list[i+t];
        }
    }
}

/*
 *直接归并,省去了“分”的过程
 */
void mergePass(int list[], int sorted[], int length) {
    int i, j;
    for(i = 0; i<=n-2*length; i+=2*length) {
        merge(list, sorted, i, i+length-1, i+2*length-1);
    }
    if(i+length < n){
        merge(list, sorted, i, i+length-1, n-1);
    } else {
        for(j = i; j<n; j++) {
            sorted[j] = list[i];
        }
    }
}

/*分层次,从length = 1 开始, 2^(i -1)
 */
void mergeSort(int list[]) {
    int length = 1;
    int extra[max_size];
    while(length < n) {
        mergePass(list, extra, length);
        length *= 2;
        mergePass(extra, list, length);
        length *= 2;
    }    
}

 int main() {  
       int list[max_size];  

       list[0] = 16;  
       list[1] = 7;  
       list[2] = 13;  
       list[3] = 10;  
       list[4] = 9;  
       list[5] = 15;  
       list[6] = 3;  
       list[7] = 2;  
       list[8] = 5;  
       list[9] = 8;  
       list[10] = 12;  
       list[11] = 1;  
       list[12] = 11;  
       list[13] = 4;  
       list[14] = 6;  
       list[15] = 14;  
       for(int i = 0; i<max_size; i++) {  
           cout<<list[i]<<" ";    
       }  
       cout<<endl;  
       mergeSort(list);  
       for(int i = 0; i<max_size; i++) {  
           cout<<list[i]<<" ";    
       }  
       cout<<endl;  
       return 0;  
   }  


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PeersLee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值