基数排序之多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);
}
时间: 2024-10-14 20:51:26

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

算法学习-基数排序(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

【JavaSE】day05_List集合_List排序_队列和栈

1.List集合 1)有序集,可重复集.List的特点是可以像数组一样,根据下标操作元素.所以List提供了一些独有的方法. 2)常用实现类: --ArrayList:内部由数组实现,查询快. --LinkedList:内部由链表实现,增删快. 3)E get(int index) 获取指定下标对应的元素.(下标从0开始) 4)E set(int index,E e) 将给定的元素设置到指定的位置上,返回值为原位置上的元素.所以该操作是替换元素操作. 注:需在现有的元素上进行操作. 代码演示:

hdu1500 (排序+单调队列优化 )

从n根筷子里面, 选择k+8个集合的筷子,每个集合三根筷子, A<=B<=C, 费用是(A-B)^2, 问最小的费用是多少. 将n根筷子排序之后,可以知道A和B的下标一定是连续的. 比如有 A B C D ,  那么不可能是A C 一个集合, B D一个集合, 因为这样费用反而更大. 设dp[i][j] 为第i个集合的筷子,以j结尾,  就是说 A和B分别是第j和第j-1个筷子 dp[i][j] = min(dp[i-1][k]) + (a[j]-a[j-1])^2 那么如何处理第三根筷子呢?

keyword排序-Es问题

问题:mapping索引registerordercount字段设置为keyword,但是在进行倒序排的视乎发现,没有按预期排序. keyword类型: "registerordercount": { "type": "keyword" } long类型: "registerordercount": { "type": "long" } 备注:registerordercount是一个数

基本排序系列之基数排序

基数排序 一.基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较. 其实现原理:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列. 二.具体操作:此排序的真正实现是通过队列的装置,先进先出的原理,通过把个位,十位,百位,等其他进制也一样,放到不同的队列中(俗称桶)再按照先进先出的原理得到新的序列,在通过百位将其重新入桶回收等操

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

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

排序——基数排序

五.基数排序 1.基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列. 2.实例 3.java实现 复制代码 package com.sort; import java.util.ArrayList; import java.util.List; //稳定 public class 基数排序 { public static void main(String[] ar

排序算法系列——基数排序

基数排序不同于其他的七种排序算法,它是基于一种分配法,而非比较.基数排序属于"分配式排序"(distribution sort),基数排序法又称"桶子法"(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些"桶"中,藉以达到排序的作用.它的灵感来自于队列(Queue),它最独特的地方在于利用了数字的有穷性(阿拉伯数字只有0到9的10个). 基本思想: 我们考虑对整数进行基数排序的过程,对于整数,