八大排序的代码实现

来源:互联网 发布:saas软件销售模式 编辑:程序博客网 时间:2024/05/17 03:01
#include <bits/stdc++.h>using namespace std;//快排void quicksort(int *a,int left,int right){if(left>=right)return;int i=left,j=right,key=a[i];while(i<j){  while(i<j&&key<=a[j]) --j;  if(i<j) a[i++]=a[j];  while(i<j&&key>=a[i]) ++i;  if(i<j) a[j--]=a[i];}a[i]=key;quicksort(a,left,i-1);quicksort(a,i+1,right);}//归并void mergr(int *a,int *temp,int left,int mid,int right){int i=left,j=mid+1,k=left;while(i<=mid&&j<=right)  a[i]<a[j]?temp[k++]=a[i++]:temp[k++]=a[j++];while(i<=mid)    temp[k++]=a[i++];while(j<=right)  temp[k++]=a[j++];for(int c=left;c<=right;++c)  a[c]=temp[c];}void mergesort(int *a,int *temp,int left,int right){if(left<right){  int mid=(left+right)/2;  mergesort(a,temp,left,mid);  mergesort(a,temp,mid+1,right);  mergr(a,temp,left,mid,right);}}//堆排序void adjustheap(int *a,int i,int size){for(int child;2*i+1<=size-1;i=child){child=2*i+1;if(child+1<=size-1&&a[child]<a[child+1])   ++child;if(a[child]>a[i])  swap(a[i],a[child]);else break;}}void heapsort(int *a,int size){    for(int i=size/2-1;i>=0;--i)     adjustheap(a,i,size);    for(int i=size-1;i>0;--i){     swap(a[0],a[i]);     adjustheap(a,0,i);    }}//冒泡void bubblesort(int *a,int len){    for(int i=0;i<len-1;++i){ //趟数   for(int j=0;j<len-1-i;++j)    if(a[j]>a[j+1]) swap(a[j],a[j+1]);}}//选择void selectsort(int *a,int len){for(int i=0,min;i<len-1;++i){min=i;for(int j=i+1;j<len;++j){  if(a[j]<a[min])  min=j;}if(min!=i) swap(a[i],a[min]);}}//插入void insertsort(int *a,int len){  for(int i=1;i<len;++i){  for(int j=i;j-1>=0&&a[j-1]>a[j];--j)    swap(a[j],a[j-1]);  }}//希尔void shellsort(int *a,int len){for(int dk=len/2;dk>=1;dk/=2)  for(int i=dk;i<len;++i)  for(int j=i;j-dk>=0&&a[j-dk]>a[j];j-=dk)    swap(a[j],a[j-dk]);}//计数void countsort(int *a,int *b,int k,int len){int c[k],i=0;memset(c,0,sizeof(int)*k);for(i=0;i<len;++i)c[a[i]]++;for(i=1;i<=20;++i)c[i]+=c[i-1];for(i=len-1;i>=0;--i){// for(i=0;i<len;++i){       b[c[a[i]]-1]=a[i];       c[a[i]]--;    }    for(i=0;i<len;++i)      a[i]=b[i];}//基数int Maxbit(int *a,int len){int max=1,temp=10;for(int i=0;i<len;++i){while(a[i]>temp){temp*=10;++max;}}return max;}void radixsort(int *a,int len){int maxbit=Maxbit(a,len);int radix=1;int temp[len];int count[10];for(int i=1,j,k;i<=maxbit;++i){       for(j=0;j<10;++j)         count[j]=0;       for(j=0;j<len;++j){         k=(a[j]/radix)%10;         ++count[k];       }       for(j=1;j<10;++j)         count[j]+=count[j-1];       for(j=len-1;j>=0;--j){          k=(a[j]/radix)%10;          temp[count[k]-1]=a[j];          --count[k];       }       for(j=0;j<len;++j)         a[j]=temp[j];       radix*=10;}}inline void Print(int *a,int len){for(int j=0;j<len;++j) cout<<a[j]<<' '; cout<<endl;}int main(){   int a[50];   int b[50]={0};   const int k=50;   int count,i;   while(true){     count=0;     for(i=0;;++i){        cin>>a[i];        count++;       if(getchar()=='\n')  break;        }    quicksort(a,0,count-1);    mergesort(a,b,0,count-1);    heapsort(a,count);    bubblesort(a,count);    selectsort(a,count);    insertsort(a,count);    shellsort(a,count);    countsort(a,b,k,count);    radixsort(a,count);    Print(a,count); }   return 0;}//√为稳定//插入排序 直接插入√ 希尔排序(平均O(nlogn))//选择排序 直接选择 堆排序//交换排序 冒泡排序√ 快速排序//归并排序√ O(n) 基数排序√ 


0 0
原创粉丝点击