计数排序(Count sort)

14 篇文章 0 订阅
11 篇文章 0 订阅

计数排序(Count sort)

在这里插入图片描述

排序思路:这是一个非基于比较的排序算法,元素从未排序状态变为已排序状态的过程,是由额外空间的辅助和元素本身的值决定的。
首先找出待排序数组最大值,以确定辅助数组(用来计数)下标的最大值,如上图序列中最大值为9,则辅助数组下标为0~9;接着遍历原序列,将原序列元素等于辅助数组下标的辅助数组元素的值+1(计数的过程);最后将辅助数组下标的值从小到大输出给原序列,下标对应元素为几就输出几次。

原序列:|8 7 6 8 4 1 9 7 4 1 7|

辅助数组元素:|0 2 0 0 2 0 1 3 2 1|

辅助数组下标:|0 1 2 3 4 5 6 7 8 9|

排序后:|1 1 4 4 6 7 7 7 8 8 9|

/*排序*/
void count_sort(int arr[],int *tempArr,int N,int maxVal){
	/*计数*/
	for(int i = 0;i < N;i++){
		tempArr[arr[i]]++;
	}
	int arrIndex = 0;
    /*将临时数组下标值,输出给原数组,下标对应元素值为几就输出几次*/
	for(int i = 0;i < maxVal;i++){
		for(int j = 0;j < tempArr[i];j++){
			arr[arrIndex++] = i;
		}
	}
}
/*排序入口:找到最大值,确定临时数组大小创建临时数组*/
void countSort(int arr[],int N){
	/*找到最大值*/
	int maxVal = arr[0];
	for(int i = 0;i < N;i++){
		if(arr[i] > maxVal){
			maxVal = arr[i];
		}
	}
    /*创建临时数组(用来计数)*/
	int* tempArr = (int*)malloc((maxVal+1)*sizeof(int));
	if(tempArr){
		count_sort(arr,tempArr,N,maxVal+1);
		/*释放内存*/
		free(tempArr);
	}
	else{
		printf("Error:分配内存失败");
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值