zoukankan      html  css  js  c++  java
  • 基数排序

    基数排序

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
    基数排序将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
    
    例如:64,8,216,512,27,729,0,1,343,125
    第一步:按照最低位优先进行排序
    |---|---|---|---|---|---|---|---|---|---|
    | 0 | 1 |512|343| 64|125|216| 27| 8 |729|
    |---|---|---|---|---|---|---|---|---|---|
    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
    |---|---|---|---|---|---|---|---|---|---|
    第二步:按照次最低位优先进行第二趟排序
    |---|---|---|---|---|---|---|---|---|---|
    | 8 |   |729|   |   |   |   |   |   |   |
    | 1 |216| 27|   |   |   |   |   |   |   |
    | 0 |512|125|   |343|   | 64|   |   |   |
    |---|---|---|---|---|---|---|---|---|---|
    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
    |---|---|---|---|---|---|---|---|---|---|
    第三步:按最高位进行排序
    |---|---|---|---|---|---|---|---|---|---|
    | 64|   |   |   |   |   |   |   |   |   |
    | 27|   |   |   |   |   |   |   |   |   |
    | 8 |   |   |   |   |   |   |   |   |   |
    | 1 |   |   |   |   |   |   |   |   |   |
    | 0 |125|216|343|   |512|   |729|   |   |
    |---|---|---|---|---|---|---|---|---|---|
    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
    |---|---|---|---|---|---|---|---|---|---|
    最后得到的结果是0,1,8,27,64,125,216,343,512,729
    需要注意的是如果两个数出自同一个桶但顺序是错误的
    

    实现

    #include<stdio.h>
    #define MAX 20
    #define BASE 10
    
    void print(int *a,int n)
    {
    	int i;
    	for( i = 0; i < n; i++)
    		printf("%d	",a[i]);
    }
    void radixsort(int *a,int n)
    {
    	int i,b[MAX],m = a[0],exp = 1;
    	for (i = 1; i < n; i++)
    	{
    		if(a[i] > m)
    			m = a[i];
    	}
    	while ( m / exp > 0)
    	{
    		int bucket[BASE] = { 0 };
    		for ( i = 0; i < n; i++)
    			bucket[(a[i] / exp) % BASE]++;
    		for ( i = 1; i < BASE; i++)
    			bucket[i] += bucket[i - 1];
    		for ( i = n - 1; i >= 0; i--)
    			b[--bucket[(a[i] / exp ) % BASE]] = a[i];
    		for ( i = 0; i < n; i++)
    			a[i] = b[i];
    		exp *= BASE;
    	#ifdef SHOWPASS
    		printf("
    PASS :");
    		print(a,n);
    	#endif
    	}
    }
    int main()
    {
    	int arr[MAX];
    	int i,n;
    	scanf("%d",&n);
    	n = n < MAX?n:MAX;
    	
    	for(i = 0; i < n; i++)
    		scanf("%d",&arr[i]);
    		
    	radixsort(&arr[0],n);
    	print(&arr[0],n);
    	
    	return 0;
    }
  • 相关阅读:
    迅为IMX6ULL开发板-Linux MISC驱动-编写实验程序
    迅为龙芯2K1000开发板快速体验
    迅为3399开发板Android系统-使用strace跟踪系统调用
    迅为imx6ull开发板使用c语言调用shell命令控制led灯
    迅为与龙芯强强联合匠心之作 iTOP-2K1000开发板正式发布
    迅为iTOP3399开发板QT系统PCIE 4G移植-测试程序
    迅为IMX8MM开发板Android编译环境搭建
    bzero和memset函数
    [linux 2021-10-14] linux中启动jar的shell脚本
    重写与重载的区别
  • 原文地址:https://www.cnblogs.com/y3w3l/p/6349775.html
Copyright © 2011-2022 走看看