基数排序

来源:互联网 发布:usb端口坏了怎么办 编辑:程序博客网 时间:2024/06/05 17:21
<pre name="code" class="cpp">/* *2014-6-15 17:33:32 *基数排序:先从最低位开始排序,逐步向高位排序。 *优点:没有比较操作,所以很快。 **//*对于 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),所以,基数排序反常规地从低位向高位排序是一大创新。*/#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("\n排序前: ");     int i;    for(i = 0; i < 10; i++)         printf("%d ", data[i]);     putchar('\n');     radixSort(data);        printf("\n排序后: ");     for(i = 0; i < 10; i++)         printf("%d ", data[i]); printf("\n\n");    return 0; } void radixSort(int data[]) {    int temp[10][10] = {0};     int counter[10] = {0};         int n = 1;     while(n <= 10) {                 int i;        for(i = 0; i < 10; i++) {             int lsd = ((data[i] / n) % 10);             temp[lsd][counter[lsd]] = data[i]; //temp[3][0]=73;temp[3][1]=93;temp[3][2]=43,第二列++            counter[lsd]++;         }                 // 新排列数据恢复到data[];        int k = 0;        for(i = 0; i < 10; i++) { for(int j = 0; j < counter[i]; j++, k++) {                     data[k] = temp[i][j]; //temp[i][j]=-1;这样容易理解,但是没必要,因为碍事的数很快会被覆盖掉。}                       counter[i] = 0; //趁机把已用过的order赋值为0,省的下次循环。        }         n *= 10; //从个位→十位→百位...    }     }


                                             
0 0
原创粉丝点击