活用各种数据结构

排序算法


一, 代价为(n^2)的排序算法:
1,插入排序:

template<typename E>
void swap(E A[], int first, int second) {
    E temp = A[first];
    A[first] = A[second];
    A[second] = temp;
}
template<typename E>
bool prior(E a, E b) {
    if (a < b)
        return true;
    else
        return false;

}
template <typename E>
void inssort(E A[], int n) {
    for (int i = 0; i < n; i++)
        for (int j = i; (j>0) && prior(A[j], A[j - 1]); j--)
            swap(A, j, j - 1);

}

2,冒泡排序:

template <typename E>
void bubsort(E A[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = n - 1; j > i; j--) {
            if (prior(A[j], A[j - 1]))
                swap(A, j, j - 1);

        }
    }
}

3,选择排序:

template<typename E>
void selsort(E A[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int lowindex = i;
        for (int j = n - 1; j > i; j--)
            if (prior(A[j], A[lowindex]))
                lowindex = j;
        swap(A, i, lowindex);

    }
}

4,Shell排序:

template<typename E>
void inssort2(E A[], int n, int incr) {
    for (int i = incr; i < n; i += incr) 
        for (int j = i; (j >= incr) && (prior(A[j], A[j - incr])); j -= incr)
            swap(A, j, j - incr);
}
template<typename E>
void shellsort(E A[], int n) {
    for (int i = n / 2; i > 2; i /= 2)
        for (int j = 0; j < i; j++)
            inssort2<E>(&A[j], n - j, i);
    inssort2<E>(A, n, 1);
}

5,归并排序:

template<typename E>
void mergesort(E A[], E temp[], int left, int right) {
    if (left == right) return;
    int mid = (left + right) / 2;
    mergesort<E>(A, temp, left, mid);
    mergessort<E>(A, temp, mid + 1, right);
    for (int i = i = left; i <= right; i++)
        temp[i] = A[i];

    int i1 = left;
    int i2 = mid + 1;
    for (int curr = left; curr <= right; curr++) {
        if (i1 == mid + 1)
            A[curr] = temp[i2++];
        else if (i2 > right)
            A[curr] = temp[i1++];
        else if (prior(temp[i1], temp[i2]))
            A[curr] = temp[i1++];
        else A[curr] = temp[i2++];
    }
}

6,快速排序:

这里写代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值