数据结构之基数排序

基数排序

先把最大数找到,用来判断最高位。终止循环用的

然后把数字根据个、十、百等位上的数来判断放在哪个桶里面(并不是把数字放进桶里,只是把这个桶的数字加一,代表桶中有一个数,这样子你只要算前面有多少个数字,你就知道当前的数字是排在第几位了)

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

//基数桶[0-9]
#define BASE 10

void radixsort(int *arr, int size){
	int i;
	int max = arr[0];
	for (i = 1; i < size; i++){
		if (max < arr[i])
			max = arr[i];
	}
	//exp是用来取个、十、百等等位的数值的除数后面再对BASE取余
	int exp = 1;
	//临时数组
	int *temp = (int*)malloc(sizeof(int)*size);
	while (max / exp > 0){
		//桶。这里有十个桶
		int Bucket[BASE] = { 0 };
		/**********************************************************
		个位或更高的位上数字相同则桶记数加一  
		相当于把数字放入桶中占个位置,但不需要把值放进桶里。
		第一次循环可能存在小数字在后面的情况。但是随着按位数入桶的位数越高,
		他们的大小顺序也越准确。(这里位数最高的也只有两位)
		当循环到最高位的位数对比时,所有的就基本都是有序的了。
		************************************************************/
		for (i = 0; i < size; i++){
			++Bucket[(arr[i] / exp) % BASE];
		}
		/**********************************************************
		记录每个桶里有多少个数,然后再把前面一个桶的数加到后面一个桶中。
		这样后面的桶中的数字,就知道前面所有桶所装的数字有多少,
		也就能推导自己是排在了哪个位置。
		***********************************************************/
		for (i = 1; i < BASE; i++){
			Bucket[i] += Bucket[i - 1];
		}
		/**********************************************************
		前面是从前往后存入数字,这里选择从后往前取数字。
		(取桶中最后一个数字的话,只需要桶里的数减一,
		就知道自己的排位。但是取前面的数字的话,就没这么方便了。)
		***********************************************************/
		for (i = size - 1; i >= 0; i--){
			temp[--Bucket[(arr[i] / exp) % BASE] ]= arr[i];
		}

		//最后再把临时数组中按个位或更高位排好序的放回到arr数组中
		for (i = 0; i < size; i++){
			arr[i] = temp[i];
		}	
		//进入下一个更高位的对比
		exp *= BASE;
	}
	free(temp);
}

int main()
{
	int arr[] = { 27, 91, 1, 97, 17, 23, 84, 28, 72, 5, 67, 25 };
	int size = sizeof(arr) / sizeof(int);
	// soer
	radixsort(arr, size);
	//print
	int i;	
	for (i = 0; i < size; ++i)
		printf("%d ", arr[i]);
	printf("\n");


	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值