基数排序的简单实现

前言

基数排序(radix sort)又称桶排序(bucket sort),相对于常见的比较排序,基数排序是一种分配式排序,即通过将所有数字分配到应在的位置最后再覆盖到原数组完成排序的过程。

所谓桶排序,就是根据数据关键字建立不同的桶,然后将元素分别插入各个桶。如下图:
在这里插入图片描述基数排序,基数即为十进制的位数。

基数排序算法过程:

①初始化:构造一个10*n的二维数组,一个长度为n的数组用于存储每次位排序时每个桶子里有多少个元素。
②循环操作:从低位开始(次位优先(LSD)),将所有元素对应该位的数字存到相应的桶子里去(对应二维数组的那一列)。然后将所有桶子里的元素按照桶子标号从小到大取出,对于同一个桶子里的元素,先放进去的先取出,后放进去的后取出(保证排序稳定性)。这样原数组就按该位排序完毕了,继续下一位操作,直到最高位排序完成。
如下图:
在这里插入图片描述

代码示例:

public class RadixSort {
	private static void radixSort(int[] array, int d) {
		int n = 1;
		int k = 0;
		int length = array.length;
		int[][] bucket = new int[10][length];
		int[] order = new int[length];
		while (n < d) {
			for (int num : array) {
				int digit = (num / n) % 10;
				bucket[digit][order[digit]] = num;
				order[digit]++;
			}
			for (int i = 0; i < length; i++) {
				if (order[i] != 0) {
					for (int j = 0; j < order[i]; j++) {
						array[k] = bucket[i][j];
						k++;
					}
				}
				order[i] = 0;
			}
			n *= 10;
			k = 0;
		}
	}

	public static void main(String[] args) {

		int[] A = new int[] { 73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 2332, 112, 3132, 342 };
		radixSort(A, 100000);
		for (int num : A) {
			System.out.println(num);
		}
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基数排序是一种基于桶排序排序算法,它通过将待排序的数字按照个位、十位、百位等位数进行排序,从而实现整体的排序。下面是一个简单基数排序的C语言实现示例: ```c #include <stdio.h> // 获取数组中的最大值 int getMax(int arr[], int n) { int max = arr[0]; for (int i = 1; i < n; i++) { if ([i] > max) { max = arr[i]; } } return max; } // 使用计数排序对数组按照指定的位数进行排序 void countSort(int arr[], int n, int exp) { int output[n]; // 存储排序后的结果 int count[10] = {0}; // 存储每个数字出现的次数 // 统计每个数字出现的次数 for (int i = 0; i < n; i++) { count[(arr[i] / exp) % 10]++; } // 计算每个数字在排序后的数组中的位置 for (int i = 1; i < 10; i++) { count[i] += count[i - 1]; } // 将数字按照指定位数排序 for (int i = n - 1; i >= 0; i--) { output[count[(arr[i] / exp) % 10] - 1] = arr[i]; count[(arr[i] / exp) % 10]--; } // 将排序后的结果复制回原数组 for (int i = 0; i < n; i++) { arr[i] = output[i]; } } // 基数排序函数 void radixSort(int arr[], int n) { int max = getMax(arr, n); // 获取数组中的最大值 // 对每个位数进行排序 for (int exp = 1; max / exp > 0; exp *= 10) { countSort(arr, n, exp); } } int main() { int arr[] = {170, 45, 75, 90, 802, 24, 2, 66}; int n = sizeof(arr) / sizeof(arr[0]); radixSort(arr, n); printf("排序后的数组:"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; } ``` 运行以上代码,输出结果为:2 24 45 66 75 90 170 802,表示数组已经按照从小到大的顺序进行了排序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值