pat排序比较

冒泡排序,Bubble_Sort();

插入排序,Insertion_sort();

希尔排序 Shell_Sort(); //大数据效果显著

sedgewick序列的希尔排序

 

堆排序 Heap_Sort(); // 性能和希尔差不多,但更难写;应该比较稳定

归并排序 Merge_Sort();

归并排序非递归

//Bubble_Sort
#include <iostream>
using namespace std;
void Bubble_Sort(int A[], int N){
    for(int p = N - 1; p > 0; p--){
        bool flag = 0;
        int tmp;
        for(int i = 0; i < p; i++){
            if(A[i] > A[i + 1]){
                tmp = A[i];
                A[i] = A[i + 1];
                A[i + 1] = tmp;
                flag = 1;
            }
        }
        if(flag == 0)   break;
    }
}
void Insertion_Sort(int A[], int N){
    int tmp;
    for(int i = 1; i < N; i++){
        tmp = A[i];
        int j;
        for(j = i; j > 0 && A[j - 1] > tmp; j--)
            A[j] = A[j - 1];
        A[j] = tmp;
    }
}
void Shell_Sort(int A[], int N){
    int D;
    for(D = N / 2; D > 0; D /= 2){
        for(int i = D; i < N; i++){
            int j;
            int tmp = A[i];
            for(j = i; j >= D && A[j - D] > tmp; j -= D)
                A[j] = A[j - D];
            A[j] = tmp;
        }
    }
}
void sedgewick(int A[], int N){
    int L[5] = {109, 41, 15, 5, 1};
    for(int p = 0; p < 5; p++){
        int D = L[p];
        for(int i = D; i < N; i++){
            int j;
            int tmp = A[i];
            for(j = i; j >= D && A[j - D] > tmp; j -= D)
                A[j] = A[j - D];
            A[j] = tmp;
        }
    }
}
void PercDown(int A[], int p, int N){
    int parent, child;
    int X = A[p];
    for(parent = p; parent * 2 + 1 < N; parent = child){
        child = parent * 2 + 1;
        if(child != N - 1 && A[child + 1] > A[child])  child++;
        if(A[child] <= X)   break;
        else    A[parent] = A[child];
    }
    A[parent] = X;
}
void Heap_Sort(int A[], int N){ 
    for(int i = N / 2 - 1; i >= 0; i--)
        PercDown(A, i, N);
    for(int i = N - 1; i > 0; i--){  //堆规模
        int L;
        L = A[0];
        A[0] = A[i];
        A[i] = L;
        PercDown(A, 0, i);
    }
}
void Merge(int A[], int tmpA[], int L, int R, int RightEnd){
    int LeftEnd = R - 1;
    int tmp = L;
    int NumElements = RightEnd - L + 1;
    while(L <= LeftEnd && R <= RightEnd){
        if(A[L] <= A[R])    tmpA[tmp++] = A[L++];
        else    tmpA[tmp++] = A[R++];
    }
    while(L <= LeftEnd) tmpA[tmp++] = A[L++];
    while(R <= RightEnd) tmpA[tmp++] = A[R++];
    for(int i = 0; i < NumElements; i++, RightEnd--)
        A[RightEnd] = tmpA[RightEnd];
}
void Msort(int A[], int tmpA[], int L, int RightEnd){
    int center;
    if(L < RightEnd){
        center = (L + RightEnd) / 2;
        Msort(A, tmpA, L, center);
        Msort(A, tmpA, center + 1, RightEnd);
        Merge(A, tmpA, L, center + 1, RightEnd);
    }
}
void Merge_Sort(int A[], int N){
    int* tmpA = new int[N];
    Msort(A, tmpA, 0, N - 1);
    delete [] tmpA;
}
void Merge1(int A[], int tmpA[], int L, int R, int RightEnd){
    int tmp = L;
    int LeftEnd = R - 1;
    while(L <= LeftEnd && R <= RightEnd){
        if(A[L] <= A[R])    tmpA[tmp++] = A[L++];
        else    tmpA[tmp++] = A[R++];
    }
    while(L <= LeftEnd) tmpA[tmp++] = A[L++];
    while(R <= RightEnd)    tmpA[tmp++] = A[R++];
}
void Merge_pass(int A[], int tmpA[], int N, int length){
    int i;
    for(i = 0; i <= N - 2 * length; i += 2 * length){
        Merge1(A, tmpA, i, i + length, i + 2 * length - 1);
    }
    if(i + length < N)  Merge1(A, tmpA, i, i + length, N -1);
    else
        for(int j = i; j < N; j++)  tmpA[j] = A[j];
}
void Merge_Sort1(int A[], int N){
    int* tmpA = new int[N];
    int length = 1;
    while(length < N){
        Merge_pass(A, tmpA, N, length);
        length *= 2;
        Merge_pass(tmpA, A, N, length);
        length *= 2;
    }
    delete[] tmpA;
}
int main()
{
    int A[100005] = {0};
    int N;
    cin >> N;
    for(int i = 0; i < N; i++)
        cin >> A[i];
    Merge_Sort1(A, N);
    for(int i = 0; i < N - 1; i++)
        cout << A[i] << ' ';
    cout << A[N - 1];
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值