1. 程式人生 > >基數排序之多keyword排序運用隊列

基數排序之多keyword排序運用隊列

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排序運用隊列