数据结构与算法-第九章计数,基数

		时间复杂度  最坏时间复杂度 空间复杂度	 稳定性
计数排序    n+k         n+k           n+k      稳定
基数排序    n*m         n*m           m        稳定

计数排序(桶排序)

void countSort(int arr[],size_t len){
	int max = arr[0];
	int min = arr[0];
	for(int i=0;i<len;i++){
		if(max < arr[i]){
			max = arr[i];	
		}	
		if(min > arr[i]){
			min = arr[i];
		}
	}
	int cnt = max+1-min;//最大值和最小值之间相差多少个数
	int *pCnt = calloc(cnt, sizeof(int));//pCnt[0]  pCnt[cnt-1]
	//pCnt[0] == 0 代表 min这个数个数为0
	//pCnt[0] == 1 代表 min这个数有一个
	//pCnt[i] == n 代表 min+i 这个数有 n 个
	for(int i=0;i<len;i++){//arr[i]这个值   pCnt[arr[i]-min]
		pCnt[arr[i]-min]++;	//arr[i]这个值的个数加1
	}
	int j = 0;
	for(int i=0;i<cnt;i++){
		while(pCnt[i] != 0){
			arr[j++] = i+min;
			--pCnt[i];
		}
	}
	free(pCnt);
}

基数排序

typedef struct Queue{
	int* m_vect;
	size_t cap;
	size_t index;
	size_t size;
}Queue;

void init(Queue *que,size_t cap){
	que->m_vect = malloc(sizeof(int)*cap);
	que->cap = cap;
	que->index = 0;
	que->size = 0;
}

void destroy(Queue *que){
	free(que->m_vect);	
}

bool isEmpty(Queue *que){
	return que->size == 0;	
}

void push(Queue *que,int data){
	if(que->size == que->cap){
		que->m_vect = realloc(que->m_vect,sizeof(int)*(que->cap+4));	
		que->cap = que->cap+4;
	}	
	que->m_vect[que->size++] = data;
}

int pop(Queue *que){
	--que->size;
	return que->m_vect[que->index++];	
}

void reset(Queue *que){
	que->size = 0;
	que->index = 0;
}

void baseSort(int arr[],size_t len){
	int max = arr[0];
	for(int i=0;i<len;i++){
		if(max < arr[i]){
			max = arr[i];	
		}	
	}
	int cnt = 0;
	while(max != 0){
		cnt++;
		max = max/10;
	}
	Queue qs[10];
	for(int i=0;i<10;i++){
		init(&qs[i],4);	
	}
	
	for(int i=0;i<cnt;i++){
		for(int k=0;k<len;k++){
			int n = arr[k];
			for(int j=0;j<i;j++){
				n = n/10;	
			}
			push(&qs[n%10],arr[k]);
		}
		int m = 0;
		for(int j=0;j<10;j++){
			while(!isEmpty(&qs[j])){
				arr[m++] = pop(&qs[j]);	
			}
			reset(&qs[j]);
		}
	}
	for(int i=0;i<10;i++){
		destroy(&qs[i]);	
	}
}
int main(){
	int arr[] = {117,38,5678,4231,998,328,91,34,27,56,23,64,28,19,77,35,48,4,17,95,83,25,58};
	size_t len = sizeof(arr)/sizeof(arr[0]);
	baseSort(arr,len);
	//countSort(arr,len);
	//quickSort(arr,len);
	//mergerSort(arr,len);
	//heapSort(arr,len);
	//bubbleSort(arr,len);
	//selectSort(arr,len);
	//cookSort(arr,len);
	//insertSort(arr,len);
	//binSort(arr,len);
	//shellSort(arr,len);
	printArr(arr,len);

	return 0;	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值