八种排序算法模板

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
const int len = 20;//待排序数组元素的个数,下标从1开始
//1、冒泡排序
void Bubble_sort(int s[],int len){
    bool flag;
    for(int i=1;i<len-1;++i){
        flag=false;
        for(int j=1;j<=len-i;++j)
            if(s[j]>s[j+1]){flag=true;swap(s[j],s[j+1]);}
        if(!flag)break;
    }
}
//2、选择排序
void Select_sort(int s[],int len){
    int k;
    for(int i=1;i<len;++i){
        k=i;
        for(int j=i+1;j<=len;++j)
            if(s[k]>s[j])k=j;
        if(k!=i)swap(s[i],s[k]);
    }
}
//3、插入排序
void Insert_sort(int s[],int len){
    int tmp,j;
    for(int i=2;i<=len;++i){
        tmp=s[i];
        for(j=i-1;j>0&&tmp<s[j];--j);
        for(int k=i;k>j+1;--k)s[k]=s[k-1];
        s[j+1]=tmp;
    }
}
//4、快速排序
int Quick_sort(int s[],int low,int high){
    int tmp=s[low];//首元素是枢轴
    while(low<high){//待排序序列长度大于1
        while(low<high&&tmp<=s[high])--high;//大于枢轴的元素依旧在右边
        s[low]=s[high];//将小于枢轴的元素放左边
        while(low<high&&tmp>=s[low])++low;//小于枢轴的元素依旧在左边
        s[high]=s[low];//将大于枢轴的元素放右边
    }
    s[low]=tmp;//枢轴记录到位
    return low;//返回枢轴的位置
}
void Qsort(int s[],int low,int high){
    if(low<high){
        int key=Quick_sort(s,low,high);
        Qsort(s,low,key-1);
        Qsort(s,key+1,high);
    }
}
//5、希尔排序(采用直接插入)
void Shell_sort(int s[],int len){
    int tmp,j;
    for(int step=len/2;step>0;step/=2){//设置步长
        for(int i=step;i<=len;++i){
            tmp=s[i];
            for(j=i-step;j>0&&tmp<s[j];j-=step);
            for(int k=i;k>j+step;k-=step)s[k]=s[k-step];
            s[j+step]=tmp;
        }
    }
}
//6、归并排序
void Merge(int s[],int t[],int low,int mid,int high){
    int i=low,j=mid+1,k=low;
    while(i<=mid&&j<=high){
        if(s[i]<=s[j])t[k++]=s[i++];
        else t[k++]=s[j++];
    }
    while(i<=mid)t[k++]=s[i++];
    while(j<=high)t[k++]=s[j++];
    for(int i=low;i<=high;++i)s[i]=t[i];//将区间[low,high]拷贝到原来数组s对应的位置,表示该区间元素已排好序
}
void Merge_sort(int s[],int t[],int low,int high){
    if(low<high){
        int mid=(low+high)/2;
        Merge_sort(s,t,low,mid);//递归分成左部分
        Merge_sort(s,t,mid+1,high);//递归分成右部分
        Merge(s,t,low,mid,high);//将两部分归并
    }
}
//7、堆排序(大根堆实现升序排序)
void Heap_Adjust(int s[],int cur,int len){
    int tmp=s[cur];//先取出当前元素cur
    for(int j=2*cur;j<=len;j*=2){//向下筛选
        if(j<len&&s[j]<s[j+1])++j;
        if(tmp>=s[j])break;
        s[cur]=s[j];cur=j;//将子节点j值赋给父节点cur(不用进行交换)
    }
    s[cur]=tmp;
}
void Heap_sort(int s[],int len){
    //1、构建大根堆
    for(int i=len/2;i>0;--i)Heap_Adjust(s,i,len);
    //2.调整堆结构+交换堆顶元素与末尾元素
    for(int i=len;i>1;--i){
        swap(s[i],s[1]);
        Heap_Adjust(s,1,i-1);//将[1,i-1]重新调整为大根堆
    }
}
//8、基数排序
int Max_bit(int s[],int len){//获取数组中最大值的位数
    int dit=1,p=10;
    for(int i=1;i<=len;++i)
        while(s[i]>=p){++dit;p*=10;}
    return dit;
}
void Radix_sort(int s[],int len){
    int exp=1,dit=Max_bit(s,len),*cnt=new int[10],*tmp=new int[len+1];
    for(int j=1;j<=dit;++j){
        for(int i=0;i<10;++i)cnt[i]=0;
        for(int i=1;i<=len;++i)cnt[s[i]/exp%10]++;
        for(int i=1;i<10;++i)cnt[i]+=cnt[i-1];//叠加元素个数
        for(int i=len;i>0;--i)tmp[cnt[s[i]/exp%10]--]=s[i];//将桶中元素倒出来
        for(int i=1;i<=len;++i)s[i]=tmp[i];//将倒出来的元素依次放到原数组中去
        exp*=10;
    }
    delete[]cnt;//释放内存
    delete[]tmp;
}
//打印数组元素值
void print(int s[],int len){
    for(int i=1;i<=len;++i)
        cout<<s[i]<<(i==len?"\n":" ");
}
int main(){
    int *s=new int[len+1];
    int *t=new int[len+1];//t为辅助数组
    srand((unsigned)time(NULL));
    for(int i=1;i<=len;++i)s[i]=rand();
    cout<<"排序前:"<<endl;
    print(s,len);//打印原数组
    /*1、冒泡排序
    Bubble_sort(s,len);*/
    /*2、选择排序
    Select_sort(s,len);*/
    /*3、插入排序
    Insert_sort(s,len);*/
    /*4、快速排序
    Qsort(s,1,len);*/
    /*5、希尔排序
    Shell_sort(s,len);*/
    /*6、归并排序
    Merge_sort(s,t,1,len);*/
    /*7、堆排序
    Heap_sort(s,len);*/
    /*8、基数排序
    Radix_sort(s,len);
    cout<<"排序后:"<<endl;*/
    print(s,len);//打印排序后的数组元素

    delete[]s;//释放内存
    delete[]t;
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,727评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,164评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,235评论 0 2
  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,323评论 0 1
  • ◆★◆微信站街,微信营销课程,微信增粉,微信营销软件论坛,微信营销北京◆★◆ ---------------- 关...
    533e4955aa9d阅读 340评论 0 0