高效算法设计

归并排序:

#include<bits/stdc++.h>
using namespace std;
int A[100];
int T[100];
int cnt;
void merge_sort(int *A, int x, int y, int *T)
{
    if(y-x > 1)
    {
        int m = x + (y-x)/2;
        int p = x, q = m, i = x;
        merge_sort(A, x, m, T);
        merge_sort(A, m, y, T);
        while(p < m || q < y)
        {
            if(q >= y || (p < m && A[p] <= A[q])) //后半截数组为空或者前半截数组的
                T[i++] = A[p++];
            else
            {
                T[i++] = A[q++];
                cnt += (m-p);
            }
        }
        for(int i = x; i < y; i++)
            A[i] = T[i];
    }
}

int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> A[i];
    cnt = 0;
    merge_sort(A, 0, n, T);
    for(int i = 0; i < n; i++)
        cout << A[i] << " ";
    cout << endl;
    cout << cnt << endl;
    return 0;
}
二分查找:

#include<bits/stdc++.h>
using namespace std;
int A[100];

int baserch(int *A, int x, int y, int v)
{
    int m;
    while(x < y)
    {
        m = (x+y)/2;
        if(A[m] == v) return m;
        else if(A[m] > v) y = m;
        else x = m+1;
    }
    return -1;
}


int main()
{
    int n;
    int v;
    cin >> n >> v;
    for(int i = 1; i < n; i++)
        cin >> A[i];
    sort(A, A+n);
    int xx = baserch(A, 0, n, v);
    cout << xx << endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值