基数排序

/*
	待排数组:data_array[] = {6, 11, 33, 7, 10, 4, 21};
	对data_array中的每个数对10求余,并将余数放入二维数组redix_array中
	--------------------------------------------------------
	redix_array(方框号内的数字代表求余后的index):
	[0]: 10
    [1]: 11, 21
	[2]: 0
	[3]: 33
	[4]: 4
	[5]: 0
	[6]: 6
	[7]: 7
	[8]: 0
	[9]: 0
	--------------------------------------------------------
	将redix_array中的数从上到下,从左到右依次放入data_array中
	data_array = {10, 11, 21, 33, 4, 6, 7}
	对data_array中的每个数的十位进行求余,并将余数放入redix_array中
	--------------------------------------------------------
	redix_array:
	[0]: 4, 6, 7
	[1]: 10, 11
	[2]: 21
	[3]: 33
	[4]: 0
	[5]: 0
	[6]: 0
	[7]: 0
	[8]: 0
	[9]: 0
	--------------------------------------------------------
	再次将redix_array中的数一次插入到data_array中,即:
	4, 6, 7, 10, 11, 21, 33(排序结束)

	算法复杂度为(数组的长度 + 数组长度(从redix_array收集所有数字放入data_array中
	)) * 数组中最大位数(维数) 即 O(2 * d * n)
*/

#include <stdio.h>

static int get_index(int number, int count)
{
	int tmp_number = 1;
	for(int i = 0; i < count; ++i)
		tmp_number *= 10;
	return number / tmp_number % 10;
}

void redix_sort(int data_array[], int len)
{
	// 最大求余次数
	const int k = 10;
	// 基数的范围
	const int redix_num = 10;

	int redix_array[redix_num][len + 1];
	for(int index = 0; index < redix_num; ++index)
	{
		// 初始化计数变量
		redix_array[index][0] = 0;
	}
	
	for(int i = 0; i < k; ++i)
	{
		for(int j = 0, index; j < len; ++j)
		{
			index = get_index(data_array[j], i);
			redix_array[index][++redix_array[index][0]] = data_array[j];
		}

		for(int index = 0, j = 0; index < redix_num; ++index)
		{
			for(int k = 1; k <= redix_array[index][0]; ++k)
			{
				data_array[j++] = redix_array[index][k];
			}
			// 将计数变量清0
			redix_array[index][0] = 0;
		}
	}
}

void main()
{
	int data_array[] = {5, 1, 33, 4, 100, 5};
	redix_sort(data_array , 6);
	for(int i = 0; i < 6; ++i)
		printf("%d ", data_array[i]);
}


运行结果: 1 4 5 5 33 100















你可能感兴趣的:(数据结构,c,算法)