数据结构之基数排序

基数排序

先把最大数找到,用来判断最高位。终止循环用的
然后把数字根据位上的数来判断放在哪个桶里面(并不是把数字放进桶里,只是把这个桶的数字加一,代表桶中有一个数,就是为了记录桶中已经假装放了多少个数)
然后再把前面的记录和自己的记录加起来,这样就知道假装放进自己这个桶里的数的下标,应该是多少。
(比如说本来有三个排队窗口但是现在其中两个都下班了,只剩下最后一个窗口了,然后这最后一个窗口让所有人都来这个窗口排序,,但是这个排序还是跟以前一样的,一号窗口的人排在最前面二号次之三号再次之)
知道每个假装放进桶里的数的下标之后,,就把他们从原数组中从后往前取出并放进临时数组里面。然后再把临时数组里面的值放进原数组里面
然后继续下一位

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

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


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];
	}
	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];
		}
		
		//这里,,,比如说本来有三个排队窗口但是现在其中两个都下班了,只剩下最后一个窗口了,
		//然后这最后一个窗口让所有人都来这个窗口排序,,但是这个排序还是跟以前一样的,一号窗口的人排在最前面二号次之三号再次之
		//这样我得把前面所有人数加起来才知道我排在第几位
		//比如下标为1的桶中有2个元素下标为2的桶中有1个元素
		//那么当把下标为2的桶的元素放在临时数组中时,应该在下标为1的桶中的元素的后面  也就是1+2
		//这样在临时数组中排到的序号就是3
		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;
}

猜你喜欢

转载自blog.csdn.net/qq_41174677/article/details/88698695