基數排序之多keyword排序運用隊列
阿新 • • 發佈:2017-07-03
printf mod n) key sort article name str oid
源碼例如以下: #include <stdlib.h> #include <stdio.h> typedef struct QUEUEnode* link; struct QUEUEnode{ int item ; link next; link head , tail; }; link NEW(int item, link next){ link x = (link) malloc(sizeof *x); x->item = item; x->next = next; return x; } void QUEUEinit(link queue, int maxN){ queue->head = NULL; } int QUEUEempty(link queue){ return queue->head == NULL; } void QUEUEput(link queue,int item){ if(queue->head == NULL){ queue->head =(queue->tail = NEW(item,queue->head)) ; return; } queue->tail->next = NEW(item,queue->tail->next); queue->tail = queue->tail->next; } int QUEUEget(link queue){ int item = queue->head->item; link t = queue->head->next; free(queue->head); queue->head = t; return item; }
//以上是QUEUE的ADT
//求整數k的第p位 int radix(int k, int p){ int i,power = 1 ; for(i=1;i<=p-1;i++) power*=10; return (k%(power*10))/power; } void p(link A){ while(!QUEUEempty(A)) printf("%d ",QUEUEget(A)); } void radixSort(int figure, link A){ //figure:待排序的數據最大位數 此方法僅僅適合數字排序 link Q[10]; int data, pass, i , r; for(pass=1;pass<=figure;pass++){ for(i=0;i<=9;i++){ Q[i] = (link)malloc(sizeof *(Q[i])); QUEUEinit(Q[i],40); //置空隊列 } while(!QUEUEempty(A)){ data = QUEUEget(A); r = radix(data,pass); QUEUEput(Q[r],data); //分別往十個隊列裏分發數據 } for(i=0;i<=9;i++) //這裏的操作還能夠再優化 while(!QUEUEempty(Q[i])) QUEUEput(A,QUEUEget(Q[i])); //最後往目標隊列回收各數位排好序的數據 } } main(){ int a[10] = {321,234,666,745,245,12,23,1,555,651}; link A = (link)malloc(sizeof*A); QUEUEinit(A,10); int i; for(i=0;i<10;i++)QUEUEput(A,a[i]); radixSort(3,A); p(A); }
基數排序之多keyword排序運用隊列