算法上机(一)几种常用的排序算法

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define RADIX 10 //基数排序的基 
#define M 9//数组大小
//插入排序 
void Insertsort(int a[],int n){
	for(int i=1;i<n;i++){
		int temp = a[i];
		int j=i;
		for(;j>0&&a[j-1]>temp;j--){
			a[j]=a[j-1];
		}
		a[j] = temp;
	}
}
//归并排序 
void Merge(int a[],int begin,int middle,int end){
	int b[end-begin+1];
	int left = begin;
	int right = middle+1;
	int j = 0;
	while(left<=middle&&right<=end){
		if(a[left]<a[right]){
			b[j] = a[left];
			left++;
			j++;
		}
		else{
			b[j] = a[right];
			right++;
			j++;
		}
	}
	while(left<=middle){
		b[j] = a[left];
		left++;
		j++;
	}
	while(right<=end){
		b[j] = a[right];
		right++;
		j++;
	}
	j=-1;
	for(int i=begin;i<=end;i++){
		a[i]=b[++j];
	}
	
}
void Mergesort(int a[],int begin,int end){
	if(begin<end){
		int middle = (begin+end)/2;
		Mergesort(a,begin,middle);
		Mergesort(a,middle+1,end);
		Merge(a,begin,middle,end);
	}
}

//快排 
int partition(int a[],int begin,int end){
	int key = a[end];
	int i = begin-1;
	for(int j=begin;j<end;j++){
		if(a[j]<=key){
			i++;
			int temp = a[i];
			a[i] = a[j];
			a[j] = temp;
		}
	}
	i++;
	a[end] = a[i];
	a[i] = key;
	return i;
}
void quiksort(int a[],int begin,int end){
	if(begin<end){
		int middle = partition(a,begin,end);
		quiksort(a,begin,middle-1);
		quiksort(a,middle+1,end);
	}
}
//随机快排 
void randomQuiksort(int a[],int begin,int end){
	if(begin<end){
		srand((unsigned)time(NULL));
		int num = (rand() % (end - begin)) + begin;
		int temp = a[num];
		a[num] = a[end];
		a[end] = temp;
		int middle = partition(a,begin,end);
		quiksort(a,begin,middle-1);
		quiksort(a,middle+1,end);
	}
}
//计数排序 
int max(int a[],int n){
	int num = a[0];
	for(int i=1;i<n;i++){
		if(a[i]>num) num = a[i];
	}
	return num;
}
int countingsort(int a[],int n){
	int num = max(a,n);
	int b[num+1];
	int c[n];
	for(int i=0;i<num+1;i++){
		b[i] = 0;
	}
	for(int i =0;i<n;i++){
		b[a[i]] = b[a[i]]+1;
	}

	for(int i=1;i<num+1;i++){
		b[i] = b[i-1]+b[i];
	}
	
	for(int i=n-1;i>=0;i--){
		c[b[a[i]]-1] = a[i];
		b[a[i]]--; 
	}
	for(int i=0;i<9;i++){
		a[i] = c[i];
	}
}
//基数排序 
int findMaxRadix(int a[]){
	int max = 0;
	int maxRadix = 0; 
	for(int i = 0;i<M;i++){
		if(max<a[i]){
			max = a[i];
		}
	}
	while (max !=0){
		max = max/RADIX;
		maxRadix ++;
	}
	return maxRadix;
}
void RadixSort(int a[],int maxRadix){
	int bucket [RADIX][M] = {};
	for(int i =0;i<=maxRadix;i++){
		int radix = (int)pow(RADIX,i);//对哪一位进行排序
		for(int j=0;j<M;j++){
			int temp = (a[j]/radix)%RADIX;	//数组中一个数在排序位的值 
			for(int k=0;k<M;k++){
				if(bucket[temp][k]==0)
                {
                    bucket[temp][k]=a[j];
                    break;
                }
			}
		}
		int count = 0;
		for(int j = 0;j<RADIX;j++){
			for(int k=0;k<M;k++){
				if(bucket[j][k]!=0){
					a[count] = bucket[j][k];
					count++;
					bucket[j][k]=0;
				}
			}
		}
	}
}

int main(void){
	int a[] = {6,5,19,3,1,17,22,4,8};
	//Insertsort(a,9);
	//Mergesort(a,0,8);
	//quiksort(a,0,8);
	//randomQuiksort(a,0,8);
	//countingsort(a,9);
	RadixSort(a,findMaxRadix(a));
	for(int i=0;i<9;i++){
		printf("%d ",a[i]);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值