您的位置:首页 > 其它

快排,堆排序,基数排序手写记录

2015-03-04 21:51 239 查看
闲来无事,手写一遍三种排序。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>

using namespace std;

//快排
void quick_sort(int v[],int s,int e)
{
    if (s>=e)
        return ;
    int key = v[s];
    int i=s;
    int t=e;
    while (i<t)
    {
        while (i<t && v[t] >= key)
            t--;
        v[i] = v[t];
        while (i<t && v[i] <=key)
            i++;
        v[t] = v[i];
    }
    v[i] = key;
    quick_sort(v,s,i-1);
    quick_sort(v,t+1,e);
}

//堆排序
void adjust(int v[],int i,int n)
{
    while (i*2+1<=n)
    {

        int next=i*2+1;
        if (i*2+2<=n && v[i*2+2]>v[i*2+1])
            next=i*2+2;
        if (v[i]<v[next])
        {
            int t=v[i];
            v[i]=v[next];
            v[next]=t;
            i=next;
        }
        else
            break;
    }
    return ;
}

void heap_sort(int v[],int n)
{
    for (int i=(n-1)/2;i>=0;i--)
        adjust(v,i,n);
    for (int i=0;i<=n;i++)
    {
        int t=v[0];
        v[0]=v[n-i];
        v[n-i]=t;
        adjust(v,0,n-i-1);
    }
}

//基数排序
int maxd(int v[],int n)
{
    int d=1;
    int m=1;
    for (int i=0;i<=n;i++)
    {
        while (v[i]/m>=n)
        {
            m*=10;
            d++;
        }
    }
    return d;
}

void radix_sort(int v[],int n)
{
    int d=maxd(v,n);
    int p=1;
    vector <int> mv[10];
    while (d--)
    {
        for (int i=0;i<n;i++)
        {
            int t=((v[i]/p)%10);
            mv[t].push_back(v[i]);
        }
        int s=0;
        for (int i=0;i<=9;i++)
        {
            for (int t=0;t<mv[i].size();t++)
            {
                v[s++]=mv[i][t];
            }
            mv[i].clear();
        }
        p*=10;
    }
}

int main()
{
    int v[10];
    for (int i=0;i<10;i++)
        cin>>v[i];
    //quick_sort(v,0,9);
    //heap_sort(v,9);
    //radix_sort(v,10);
    for (int i=0;i<10;i++)
        cout<<v[i]<<" ";
    cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐