zoukankan      html  css  js  c++  java
  • 八种排序算法模板

      1 #include<iostream>
      2 #include<cstdlib>
      3 #include<ctime>
      4 using namespace std;
      5 const int len = 20;//待排序数组元素的个数,下标从1开始
      6 //1、冒泡排序
      7 void Bubble_sort(int s[],int len){
      8     bool flag;
      9     for(int i=1;i<len-1;++i){
     10         flag=false;
     11         for(int j=1;j<=len-i;++j)
     12             if(s[j]>s[j+1]){flag=true;swap(s[j],s[j+1]);}
     13         if(!flag)break;
     14     }
     15 }
     16 //2、选择排序
     17 void Select_sort(int s[],int len){
     18     int k;
     19     for(int i=1;i<len;++i){
     20         k=i;
     21         for(int j=i+1;j<=len;++j)
     22             if(s[k]>s[j])k=j;
     23         if(k!=i)swap(s[i],s[k]);
     24     }
     25 }
     26 //3、插入排序
     27 void Insert_sort(int s[],int len){
     28     int tmp,j;
     29     for(int i=2;i<=len;++i){
     30         tmp=s[i];
     31         for(j=i-1;j>0&&tmp<s[j];--j);
     32         for(int k=i;k>j+1;--k)s[k]=s[k-1];
     33         s[j+1]=tmp;
     34     }
     35 }
     36 //4、快速排序
     37 int Quick_sort(int s[],int low,int high){
     38     int tmp=s[low];//首元素是枢轴
     39     while(low<high){//待排序序列长度大于1
     40         while(low<high&&tmp<=s[high])--high;//大于枢轴的元素依旧在右边
     41         s[low]=s[high];//将小于枢轴的元素放左边
     42         while(low<high&&tmp>=s[low])++low;//小于枢轴的元素依旧在左边
     43         s[high]=s[low];//将大于枢轴的元素放右边
     44     }
     45     s[low]=tmp;//枢轴记录到位
     46     return low;//返回枢轴的位置,表示该位置已经排好序
     47 }
     48 void Qsort(int s[],int low,int high){
     49     if(low<high){
     50         int key=Quick_sort(s,low,high); // 第key个元素已经排好序,继续两边搜索排序
     51         Qsort(s,low,key-1);
     52         Qsort(s,key+1,high);
     53     }
     54 }
     55 //5、希尔排序(采用直接插入)
     56 void Shell_sort(int s[],int len){
     57     int tmp,j;
     58     for(int step=len/2;step>0;step/=2){//设置步长
     59         for(int i=step;i<=len;++i){
     60             tmp=s[i];
     61             for(j=i-step;j>0&&tmp<s[j];j-=step);
     62             for(int k=i;k>j+step;k-=step)s[k]=s[k-step];
     63             s[j+step]=tmp;
     64         }
     65     }
     66 }
     67 //6、归并排序
     68 void Merge(int s[],int t[],int low,int mid,int high){
     69     int i=low,j=mid+1,k=low;
     70     while(i<=mid&&j<=high){
     71         if(s[i]<=s[j])t[k++]=s[i++];
     72         else t[k++]=s[j++];
     73     }
     74     while(i<=mid)t[k++]=s[i++];
     75     while(j<=high)t[k++]=s[j++];
     76     for(int i=low;i<=high;++i)s[i]=t[i];//将区间[low,high]拷贝到原来数组s对应的位置,表示该区间元素已排好序
     77 }
     78 void Merge_sort(int s[],int t[],int low,int high){
     79     if(low<high){
     80         int mid=(low+high)/2;
     81         Merge_sort(s,t,low,mid);//递归分成左部分
     82         Merge_sort(s,t,mid+1,high);//递归分成右部分
     83         Merge(s,t,low,mid,high);//将两部分归并
     84     }
     85 }
     86 //7、堆排序(大根堆实现升序排序)
     87 void Heap_Adjust(int s[],int cur,int len){
     88     int tmp=s[cur];//先取出当前元素cur
     89     for(int j=2*cur;j<=len;j*=2){//向下筛选
     90         if(j<len&&s[j]<s[j+1])++j;
     91         if(tmp>=s[j])break;
     92         s[cur]=s[j];cur=j;//将子节点j值赋给父节点cur(不用进行交换)
     93     }
     94     s[cur]=tmp;
     95 }
     96 void Heap_sort(int s[],int len){
     97     //1、构建大根堆
     98     for(int i=len/2;i>0;--i)Heap_Adjust(s,i,len);
     99     //2.调整堆结构+交换堆顶元素与末尾元素
    100     for(int i=len;i>1;--i){
    101         swap(s[i],s[1]);
    102         Heap_Adjust(s,1,i-1);//将[1,i-1]重新调整为大根堆
    103     }
    104 }
    105 //8、基数排序
    106 int Max_bit(int s[],int len){//获取数组中最大值的位数
    107     int dit=1,p=10;
    108     for(int i=1;i<=len;++i)
    109         while(s[i]>=p){++dit;p*=10;}
    110     return dit;
    111 }
    112 void Radix_sort(int s[],int len){
    113     int exp=1,dit=Max_bit(s,len),*cnt=new int[10],*tmp=new int[len+1];
    114     for(int j=1;j<=dit;++j){
    115         for(int i=0;i<10;++i)cnt[i]=0;
    116         for(int i=1;i<=len;++i)cnt[s[i]/exp%10]++;
    117         for(int i=1;i<10;++i)cnt[i]+=cnt[i-1];//叠加元素个数
    118         for(int i=len;i>0;--i)tmp[cnt[s[i]/exp%10]--]=s[i];//将桶中元素倒出来
    119         for(int i=1;i<=len;++i)s[i]=tmp[i];//将倒出来的元素依次放到原数组中去
    120         exp*=10;
    121     }
    122     delete[]cnt;//释放内存
    123     delete[]tmp;
    124 }
    125 //打印数组元素值
    126 void print(int s[],int len){
    127     for(int i=1;i<=len;++i)
    128         cout<<s[i]<<(i==len?"
    ":" ");
    129 }
    130 int main(){
    131     int *s=new int[len+1];
    132     int *t=new int[len+1];//t为辅助数组
    133     srand((unsigned)time(NULL));
    134     for(int i=1;i<=len;++i)s[i]=rand();
    135     cout<<"排序前:"<<endl;
    136     print(s,len);//打印原数组
    137     /*1、冒泡排序
    138     Bubble_sort(s,len);*/
    139     /*2、选择排序
    140     Select_sort(s,len);*/
    141     /*3、插入排序
    142     Insert_sort(s,len);*/
    143     /*4、快速排序
    144     Qsort(s,1,len);*/
    145     /*5、希尔排序
    146     Shell_sort(s,len);*/
    147     /*6、归并排序
    148     Merge_sort(s,t,1,len);*/
    149     /*7、堆排序
    150     Heap_sort(s,len);*/
    151     /*8、基数排序
    152     Radix_sort(s,len);
    153     cout<<"排序后:"<<endl;*/
    154     print(s,len);//打印排序后的数组元素
    155 
    156     delete[]s;//释放内存
    157     delete[]t;
    158     return 0;
    159 }
  • 相关阅读:
    学习九-python 异常处理
    验证基于逻辑回归的隐马尔可夫模型的心音信号切分算法(literature study)
    字典的内置方法比较
    学习六
    Ubuntu 16.04 LTS 搜狗输入法安装
    集合经验模态分解(EEMD)在语音中的应用举例
    SwfUpload及imgareaselect使用方法
    Uploadify插件使用方法
    Ueditor使用方法
    PartialView 加载Js
  • 原文地址:https://www.cnblogs.com/acgoto/p/9211511.html
Copyright © 2011-2022 走看看