• 基数排序


    基数排序

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
    基数排序将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
    
    例如: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;
    }
  • 相关阅读:
    删除文件时,提示 "操作无法完成..." 怎么处理
    对象的理解
    TP5架构下链接SQL数据库的一种方法
    关于URL隐藏index.php方法
    非典型的千万用户后台之路
    就这样,再见2015
    理想的程序员
    4个小例子告诉你:如何成为一名数据极客
    馆中窥职:小公司没那么糟糕
    JAVA设计模式详解(六)----------状态模式
  • 原文地址:https://www.cnblogs.com/y3w3l/p/6349775.html
Copyright © 2020-2023  润新知