基数排序

/*
 *		
 *		基数排序:先从最低位开始排序,逐步向高位排序。
 *		优点:没有比较操作,所以很快。
 *
*/
/*
对于 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; //从个位→十位→百位... } }


原文地址:https://www.cnblogs.com/sjw1357/p/3864006.html