数据结构 排序 基数排序(1)

来源:互联网 发布:linux 执行二进制文件 编辑:程序博客网 时间:2024/06/13 23:25

1.可参考代码

#include <bits/stdc++.h>#define SIZE 0x32#define rd 10using namespace std;typedef struct snode{    int key;    struct snode* next;//下位指针} *sRadix;typedef struct bnode{    sRadix d[SIZE];//最大长度    int length;//实际长度} bRadix;int a[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};//辅助下标数组int getPos(int value, int pos);//获得下标void radixSort(bRadix &rl);//基数排序void printL(bRadix rl);//打印收集链表void printC(bRadix r);//打印分配过程int main(){    bRadix rl;//收集主链表    bRadix la;//运动链表    cout << "- - - - - - - - -1.基数排序- - - - - - - - -\n";    cout << "请输入需排序的序列的长度:\n";    cin >> rl.length;    cout << "初始化收集表...";    rl.d[rl.length] = new snode;    rl.d[rl.length]->next = NULL;    la = rl;    cout << "请输入序列的元素集合:\n";    for(int i = 0; i < rl.length; i++){//初始化收集链表        sRadix p = new snode;        cin >> p->key;        p->next = la.d[rl.length]->next;        la.d[rl.length]->next = p;        la.d[rl.length] = p;    }    radixSort(rl);    cout << "进过排序后的序列如下...\n";    printL(rl);    return 0;}int getPos(int value, int pos){    return value / a[pos - 1] % 10;}void radixSort(bRadix &rl){    int maxValue = 0, d = 1;    bRadix r;    r.length = rl.length;    r.d[r.length] = rl.d[rl.length];    while(r.d[rl.length]->next){        if(r.d[rl.length]->next->key > maxValue)            maxValue = r.d[rl.length]->next->key;        r.d[rl.length] = r.d[rl.length]->next;    }    for(int i = 1; i < rd; i++)        if(maxValue / a[i] == 0) break;        else d++;    for(int i = 1; i <= d; i++){        printf("- - - - - - - - -第%d次分配- - - - - - - - -\n", i);        bRadix r2, r0;        r0.length = r2.length = rl.length;        r0.d[r0.length] = r2.d[r2.length] = rl.d[rl.length];        for(int k = 0; k < rl.length; k++){            r0.d[k] = r2.d[k] = new snode;            r0.d[k]->next = r2.d[k]->next = NULL;        }        while(r0.d[r0.length]->next){            int key = r0.d[rl.length]->next->key;            int pos = getPos(key, i);            for(int j = 0; j < rd; j++){                if(pos == j){                    sRadix p = new snode;                    p->key = key;                    p->next = r0.d[j]->next;                    r0.d[j]->next = p;                    r0.d[j] = p;                    j = rd;                }            }            r0.d[r0.length] = r0.d[r0.length]->next;        }        printC(r2);        for(int j = 0; j < rd; j++){            if(r2.d[j]){                while(r2.d[j]->next){                    int key = r2.d[j]->next->key;                    r2.d[rl.length]->next->key = key;                    r2.d[j] = r2.d[j]->next;                    r2.d[rl.length] = r2.d[rl.length]->next;                }            }        }    }    cout << "- - - - - - - - -排序结束- - - - - - - - -\n";}void printL(bRadix rl){    while(rl.d[rl.length]->next){        cout << rl.d[rl.length]->next->key << " ";        rl.d[rl.length] = rl.d[rl.length]->next;    }    cout << endl;}void printC(bRadix r){    for(int i = 0; i < rd; i++){        printf("#(%d)", i);        if(r.d[i]){            while(r.d[i]->next){                cout << "->" << r.d[i]->next->key;                r.d[i] = r.d[i]->next;            }        }        cout << endl;    }}

2.实际结果图


原创粉丝点击