八大排序的代码实现

#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) 基数排序√ 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值