# INSERT_SORT&MERGE_SORT插入排序与归

INSERT_SORT&MERGE_SORT插入排序与归并排序

当数据量小时,归并排序并不会比插入排序快。但是,当数据量很大时,则归并排序十分有利。因此,可以融合两种排序方式,使得归并排序的区间小于一给定的k值时,执行插入排序。从而优化算法。
以下是算法:

#define REP(i, n) for(int i = 0; i < (n); i++)
#define INF 1000000
typedef const int CI;
#include<iostream>
using namespace std;
int k;
void INSERT_SORT(int *A, int p, int r) {
    int n = r - p + 1;
    REP(i, n) {
        int key = A[p + i];
        int j = i - 1;
        while (j >= 0 && A[p + j] > key) {
            A[p + j + 1] = A[p + j];
            j--;
        }
        A[p + j + 1] = key;
    }
}

void MERGE(int *A, int p, int q, int r) {
    int n1 = q - p + 1, n2 = r - q;
    int *L = new int[n1 + 1], *R = new int[n2 + 1];
    REP(i, n1)L[i] = A[p + i];
    REP(i, n2)R[i] = A[q + 1 + i];
    L[n1] = INF;
    R[n2] = INF;
    int i = 0, j = 0;
    FOR(k, p, r) {
        if (L[i] < R[j]) { A[k] = L[i++]; }
        else { A[k] = R[j++]; }
    }
}

void MERGE_SORT(int *A, int p, int r) {
    if (r - p + 1 <= k)INSERT_SORT(A, p, r);
    else {
        int mid = p + (r - p) / 2;
        MERGE_SORT(A, p, mid);
        MERGE_SORT(A, mid + 1, r);
        MERGE(A, p, mid, r);
    }
}
CI maxn = 500000;
int main() {
    freopen("out.txt", "r", stdin);
    freopen("out_1.txt", "w", stdout);
    k = 11;
    int A[maxn];
    REP(i, maxn)cin >> A[i];

    MERGE_SORT(A, 0, maxn);
    REP(i, maxn)cout << A[i] << " ";
    cout << endl;
    system("PAUSE");
    return 0;
}

使用以下算法随机生成n个随机数,进行数据测试

#define REP(i, n) for(int i = 0; i < (n); i++)
#include<iostream>
using namespace std;

int main(){
    freopen("out.txt","w", stdout);
    int n;
    cin>>n;
    REP(i, n)cout<<rand()<<" ";
    return 0;
}

当待排数据为500000时,运行排序算法,分别设置成以下k值时运行时间如下:
1 1.196
2 1.165
3 1.128
4 1.11
5 1.142
6 1.112
7 1.098
8 1.095
9 1.1
10 1.089
11 1.103
15 1.09
20 1.092
25 1.136
30 1.155
50 1.903
100 1.116
250 1.219
500 1.402
1000 1.785
1500 1.795
3000 2.674
5000 4.328

这里写图片描述
从图中可见,当为1时,此时执行的基本为纯粹的归并排序,效率并不是最高的。
经过测试,发现k=10附近的效率是较为理想的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值