基数排序之多keyword排序运用队列

Posted cxchanpin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基数排序之多keyword排序运用队列相关的知识,希望对你有一定的参考价值。

源码例如以下:

#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排序运用队列的主要内容,如果未能解决你的问题,请参考以下文章

基数排序 C++ 不屏蔽位

归并排序,栈,队列,基数排序,桶排序

_DataStructure_C_Impl:基数排序

数据结构作业之用队列实现的基数排序(Java版)

基数排序

对 6 位非负数数组进行基数排序