基数排序之多关键字排序运用队列

源代码如下:

#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);
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 20:03:35

基数排序之多关键字排序运用队列的相关文章

基数排序之多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;

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

多关键字排序

很欢迎来看我的博客,我还有很多知识没有学习,这是我的考核作业!以此记录我的学习历程!大家参考就好!如有错误,敬请指出!在此,先谢谢一番! 多关键字排序就是基数排序,我是用单链表实现多关键字的排序的,但最主要的方法仍是"分配","收集".单链表只是在分配与收集过程中起暂时的存储作用.不仅可以用链表,还可以用栈.队列--(都是线性的!!!(^_^)) 这是结点类模板的定义: #ifndef NODE_H #define NODE_H #define NULL 0 tem

多关键字排序实验

一.实习目的 了解多关键字的使用范围:编写程序实现对汽车牌照的排序. 二.实验原理 了解多关键字的使用范围,并实现对牌照按多关键字排序后的快速查找. [问题描述] 为加快速度需先对数据记录按关键字排序,在汽车数据模型中,汽车是关键字,而且是具有结构特点的一类关键字.因为汽车牌照是汉字,字母和数字混编的,例如:AD7328.这种记录集合是一个适于利用多关键字进行排序的典型例子. [基本任务] (1)利用链式基数排序方法实现排序. (2)在排序的基础上,利用二分查找的思想,实现对汽车记录按关键字的查

【基础练习】结构体定义比较函数双关键字排序

题目好长显得很高大上的样子其实一点也不是这样= = 再次感谢里奥同学的友情支持,没有他我现在还在一片云里雾里. 之前看ruka上一直说:可以自定义排序,但必须自定义小于号或者是比较函数,一直苦于如何实践,今天请教了里奥同学,终于拨云见日. 这样的题有很多类似的,像是codevs 3991排序(例题代码即为此题,但我会告诉你我是用后面那个题代码改的么···)  洛谷P1104 生日 都是很简单的多关键字排序 二话不说,上代码 //operator < and sort #include<cstd

算法学习-基数排序(radix sort)卡片排序(card sort) C++数组实现

基数排序又叫卡片排序,这是在比较早的时候用的比较多的排序方法. 在现代计算机出现之前,一直用于老式穿孔卡的排序. 说下基数排序的思想,前面我有写一个桶式排序,基数排序的思想是桶式排序的推广. 桶式排序:http://blog.csdn.net/alps1992/article/details/38132593 基数排序的思想是在于只有10个桶,而不是最大数是多少就有多少个桶.假如我们有10个乱序的数字. 第一趟排序之后 0 1 512 343 64 125 216 27 8 729 0 1 2

排序技巧——双关键字排序

一个萌新的成长之路 Background 在做题过程中,我们常会遇到对双关键字排序的情况,如:当分数相等时,序号小的在前. 这时我们可以通过定义cmp函数作为sort的参数进行排序. Solution 定义一个结构体,包含我们所需的关键字.例如,这是一个包含分数,序号和姓名的结构体. struct node{ int id,score; string name; }; -实现cmp函数,这里使用了两组不同的关键字. bool cmp_score_id(node a,node b) { if(a.

Python关键字排序

一.当排序关键字多于1个时,我们使用lambda表达式来描述关键字key arr=[(1,4,3),(1,3,3),(2,1,4),(3,5,1)] arr.sort(key=lambda s:(s[0],s[1])) #两个关键字排序print(arr) # 可以看到输出结果是根据列表中元组的第一项和第二项排序[(1, 3, 3), (1, 4, 3), (2, 1, 4), (3, 5, 1)] 二.若我想让第一个关键字正序,第二个关键字倒序,该怎么办呢?arr=[(1,4,3),(1,3,

SQL 按关键字排序

SQL ORDER BY Keyword(按关键字排序) ORDER BY 关键字用于对结果集进行排序. SQL ORDER BY 关键字 ORDER BY 关键字用于按升序或降序对结果集进行排序. ORDER BY 关键字默认情况下按升序排序记录. 如果需要按降序对记录进行排序,可以使用DESC关键字. SQL ORDER BY 语法 SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|