几种常见的排序算法

//待排序元素 存储在0~L.length-1 之中
#define MAX 10000
typedef int Eletype;
typedef struct
{
    Eletype a[MAX];
    int length;
}Sqlist;
Eletype num[MAX];
// 插入 排序 O(n^2)
void insert_sort(Sqlist &L)
{
    for(int i=1; i<L.length; i++)
    {
        Eletype tmp=L.a[i];
        int  j;
        for(j=i; j>0; j--)
        {
            if(tmp < L.a[j-1]) L.a[j]=L.a[j-1];
            else break;
        }
        L.a[j]=tmp;
    }
}
//希尔排序 增量为dlta[k]=2^(t-k+1) -1时, 为O(n^(3/2)) 1<=k<=t<=ln(n+1) 
void shell_insert(Sqlist &L, int dk)
{
    for(int i=dk; i<L.length; i++)
    {
        Eletype tmp=L.a[i];
        int j;
        for(j=i; j-dk>=0; j-=dk)
        {
            if(tmp < L.a[j-dk]) L.a[j]=L.a[j-dk];
            else break;
        }
        L.a[j]=tmp;
    }
}
void shell_sort(Sqlist &L)
{
    int dlta[10000],t;
    t=100;
    for(int i=0; i<t; i++) dlta[i]=(1<<(t-i+1) ) -1;//此增量的设置忽略(随意设置的)
    for(int k=0; k<t; k++) shell_insert(L, dlta[k]);
}
//冒泡排序  O(n^2)
void bubble_sort(Sqlist &L)
{
    for(int i=1; i<L.length; i++)
    {
        for(int j=0; j<L.length-i; j++)
            if(L.a[j] > L.a[j+1]) swap(L.a[j], L.a[j+1]);
    }
}
//选择排序 O(n^2)
void select_sort(Sqlist &L)
{
    for(int i=0; i<L.length; i++)
    {
        int j=i;
        for(int k=i+1; k<L.length; k++)
        {
            if(L.a[k]<L.a[j]) j=k;
        }
        if(j!=i) swap(L.a[i], L.a[j]);
    }
}
//快速排序 O(n*ln(n))
int partition(Sqlist &L, int low, int high)
{
    Eletype tmp=L.a[low];
    while(low<high)
    {
        while(low<high && L.a[high]>=tmp) high--;
        L.a[low]=L.a[high];
        while(low<high && L.a[low]<=tmp) low++;
        L.a[high]=L.a[low];
    }
    L.a[low]=tmp;
    return low;
}
void quick_sort(Sqlist &L, int low, int high)
{
    if(low>=high) return ;
    int tmp=partition(L, low, high);
    quick_sort(L, low, tmp-1);
    quick_sort(L, tmp+1, high);
}
//归并排序 O(n*ln(n)) 
void Merge(Sqlist &L, int l,int m,int r)
{
    int k=0,i,j;
    for(i=l, j=m+1; i<=m && j<=r; k++)
    {
        if(L.a[i]<L.a[j]) num[k]=L.a[i++];
        else num[k]=L.a[j++];
    }
    if(i<=m) memcpy(num+k, L.a+i, (m-i+1)*sizeof(Eletype));
    if(j<=r) memcpy(num+k, L.a+j, (r-j+1)*2*sizeof(Eletype));
    memcpy(L.a+l, num, (r-l+1)*sizeof(Eletype));
}
void Msort(Sqlist &L,int l, int r)
{
    if(l>=r) return ;
    int m=(l+r)>>1;
    Msort(L, l,m);
    Msort(L, m+1, r);
    Merge(L, l, m, r);
}
//堆排序 O(n*ln(n)) 
void heapadjust(Sqlist &L, int l,int r)
{
    Eletype tmp=L.a[l-1];
    for(int j=2*l; j<=r; j*=2)
    {
        if(j<r && L.a[j-1]<L.a[j]) j++;
        if(tmp>L.a[j-1]) break;
        L.a[l-1]=L.a[j-1]; l=j;
    }
    L.a[l-1]=tmp;
}
void heap_sort(Sqlist &L)
{
    for(int i=L.length/2; i>0; i--)
        heapadjust(L, i, L.length);
    for(int i=L.length; i>1; i--)
    {
        swap(L.a[0], L.a[i-1]);
        heapadjust(L, 1, i-1);
    }
}
void display(Sqlist L)
{
    printf("%d", L.a[0]);
    for(int i=1; i<L.length; i++) printf(" %d", L.a[i]);
    puts("");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值