基数排序

来源:互联网 发布:擦枪字幕组怎么样知乎 编辑:程序博客网 时间:2024/05/16 08:39

基数排序指的是先将个位数排序,然后再按十位数排序.....依次往后,当排到最大位的时候排序结束

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;const int maxn = 10;int m, n, MAX, MAX_NUM;int a[50] = {0};int getnum(int x, int pos)   // 获得第pos位的数{    int t = 1;    for(int i = 0; i < pos - 1; ++i) t *= 10;    return (x / t) % 10;}void radix_sort(){    int *arr[maxn];  //辅助数组    for(int i = 0; i < maxn; ++i) {        arr[i] = (int *)malloc(sizeof(int) * (n + 1));        memset(arr[i], 0, sizeof(arr));    }    for(int pos = 1; pos <= MAX_NUM + 1; ++pos) {        for(int i = 0; i < n; ++i) {            int num = getnum(a[i], pos);            int id = ++arr[num][0];   // arr[num][0]存的是现在位数为num的数的个数            arr[num][id] = a[i];        }        for(int i = 0, j = 0; i < maxn; ++i) {            for(int k = 1; k <= arr[i][0]; ++k)                a[j++] = arr[i][k];    //从桶中取回            arr[i][0] = 0;        }        //memset(arr, 0, sizeof(arr));  这个是错的。。用了会RE,不知道为啥。。    }    return ;}int main() {    scanf("%d", &n);    MAX = -1;    for(int i = 0; i < n; ++i) {        scanf("%d", &a[i]);        if(a[i] > MAX) MAX = a[i];    }    MAX_NUM = 0;    while(MAX != 0) {        MAX /= 10;        ++MAX_NUM;  //最大值的位数    }    radix_sort();    for(int i = 0; i < n; ++i)        printf("%d ", a[i]);    printf("\n");    return 0;}


0 0
原创粉丝点击