八种排序算法模板

  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?"\n":" ");
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 }

 

posted @ 2018-06-21 23:54  霜雪千年  阅读(1166)  评论(0编辑  收藏  举报