zoukankan      html  css  js  c++  java
  • 经典排序算法---基数排序

    假设原来有一串数值如下所示:
    73, 22, 93, 43, 55, 14, 28, 65, 39, 81
    首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
    0
    1 81
    2 22
    3 73 93 43
    4 14
    5 55 65
    6
    7
    8 28
    9 39

    第二步

    接下来将这些桶子中的数值重新串接起来,成为以下的数列:
    81, 22, 73, 93, 43, 14, 55, 65, 28, 39
    接着再进行一次分配,这次是根据十位数来分配:
    0
    1 14
    2 22 28
    3 39
    4 43
    5 55
    6 65
    7 73
    8 81
    9 93

    第三步

    接下来将这些桶子中的数值重新串接起来,成为以下的数列:
    14, 22, 28, 39, 43, 55, 65, 73, 81, 93
     
    代码:
    //获取末尾数
    int getmantissa(int num, int digits) {
    	int temp = 1;
    	for (int x = 0; x < digits - 1; ++x)
    		temp *= 10;
    	return (num / temp) % 10;
    }
    
    void radixsort(struct SQ_LIST *v) {
    	int digit = 1;
    	//获取位数
    	int save[10][100001];
    	for (int i = 0, p = 10; i < v->Length; ++i)
    		while (v->elem[i].ID >= p) {
    			p *= 10;
    			++digit;
    		}
    
    	//初始化二位数组每行的首元
    	for (int x = 0; x < 10; x++) {
    		save[x][0] = 0;
    	}
    
    	//基数排序
    	for (int i = 1; i <= digit; i++) {
    		for (int x = 0; x < v->Length+1; ++x) {
    			int mantissa = getmantissa(v->elem[x].ID, i);
    			int index = ++save[mantissa][0];        //每行的首元存储每行数据量
    			save[mantissa][index] = v->elem[x].ID;
    		}
    
    		//合并
    		for (int i = 0, x = 0; i < 10; i++) {
    			for (int j = 0; j < save[i][0]; ++j) 
    				v->elem[x++].ID = save[i][j + 1];
    			save[i][0] = 0;                      //重新初始化每行首单元                 
    		}
    	}
    }
    

      

  • 相关阅读:
    oracle数据库使用PL/sql导入excel数据
    http协议详解之响应报文 3
    http详解之post 2
    http协议详解1
    tomcat配置https协议
    linux服务端导入oracle数据库.sql脚本
    fiddler查看http压缩格式传输的报文
    SurfaceView绘制录音波形图
    android 蓝牙SPP协议通信
    好用的Android屏幕适配
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/5505609.html
Copyright © 2011-2022 走看看