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

    /*
     *		
     *		基数排序:先从最低位开始排序,逐步向高位排序。
     *		优点:没有比较操作,所以很快。
     *
    */
    /*
    对于 a[9]={19,38,37,36,64,54,82,92,72}
    
    若从低位向高位逐步排列可以有效减少空间开销。
    	1)排序个位数字,得到:a[]={82,92,72,64,54,36,37,38,19};
    	2)排序十位数字,得到:a[]={19,36,37,38,54,64,72,82,92};
    
    	
    若从高位向低位排序,显然38,37,36三个数需要进一步排序。
    	1)若不开辟额外空间,
    		(1.1)则第一次排序后:a[]={19,38,37,36,54,64,72,82,92}	
    		(1.2)继续向低位排序,a[]={72,82,92,54,64,36,37,38,19},跟没排一个样
    	2)若开辟额外空间
    		(2.1)对38,37,36进行额外排序,得到最终结果a[]={19,36,37,38,54,64,72,82,92};
    	
    分析:38,37,36仅为两位数,其最高位相同,但是个位的排序需要开辟10个空间(0-9),用于对比,且若有43,42,41.则也需要空间,最差情况下需要 o(10^2)的空间。
    若数字均为n位数,则空间数最差情况下为o(10^n)。
    <pre name="code" class="cpp">
    
    所以,基数排序反常规地从低位向高位排序是一大创新
    */#include <stdio.h> #include<stdlib.h>int data[10] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81}; void radixSort(int[]);int main(void) { printf(" 排序前: "); int i; for(i = 0; i < 10; i++) printf("%d ", data[i]); putchar(' '); radixSort(data); printf(" 排序后: "); for(i = 0; i < 10; i++) printf("%d ", data[i]); printf(" "); return 0; } void radixSort(int data[]) { int temp[10][10] = {0}; int order[10] = {0}; int n = 1; while(n <= 10) { int i; for(i = 0; i < 10; i++) { int lsd = ((data[i] / n) % 10); temp[lsd][order[lsd]] = data[i]; //temp[3][0]=73; temp[3][1]=93; temp[3][2]=43,第二列++ order[lsd]++; } // 新排列数据恢复到data[]; int k = 0; for(i = 0; i < 10; i++) { for(int j = 0; j < order[i]; j++, k++) { data[k] = temp[i][j]; //temp[i][j]=-1;这样容易理解,但是没必要,因为碍事的数很快会被覆盖掉。} order[i] = 0; //趁机把已用过的order赋值为0,省的下次循环。 } n *= 10; //从个位→十位→百位... } }
    
    
  • 相关阅读:
    七天冲刺04
    软件工程概论项目——典型用户场景分析
    七天冲刺3
    七天冲刺2
    七天冲刺1
    第十三周总结
    软件工程概论个人作业02
    第二周学习进度
    软件工程个人作业01--四则运算
    连接数据库的javaee编译简易的WEB登陆界面
  • 原文地址:https://www.cnblogs.com/sjw1357/p/3864006.html
Copyright © 2011-2022 走看看