您的位置:首页 > 编程语言

多趟桶式排序bucket sort

2012-11-20 21:10 106 查看
      如果有N个整数,范围为1到M(或者0 到M-1),我们可以利用这些信息得到一种快速排序算法,称之为桶式排序 bucket sort。我们初始化以个大小为M的各项值为零COUNT的数组。当第一个数据Ai输入时COUNT[Ai]加一。这种算法可以对于输入数据之间相差较小时,运行速度很快。如果数据的最大值和最小值相差很大时,算法运行时会很费内存。如只输入2个数据,范围为0-999。按照上述的说明,要定义一个大小为1000的数组。

      鉴于该算法的缺点,提出了一种多趟桶式排序算法。设我们有10个数,范围为0-999,用多趟桶式排序算法进行排序。多趟桶式排序的算法文字说明详见《数据结构与算法描述》的P55.

数据输入:有10个数,范围为0到999。程序运行按照下述格式输入数据:

[root@lumotuwe] gcc cas.c -o cas

[root@lumotuwe] ./cas 64 8 216 512 27 729 0 1 343 125



代码如下:

cas.h

#ifndef _CARDSORT_H
struct cardsort
{
int number;
int * data;
struct cardsort * next;
};

typedef struct cardsort * list;

/***************************************
function: get the pointer on position in the list
***************************************/
list get_pointer(list head,int position)
{
list tmp;
tmp=head;
while(position--)
{
tmp = tmp->next;
}
return tmp;
}
void send_data_to_list(int data,int position,list head)
{
list tmp;
tmp=get_pointer(head,position);
*(tmp->data+tmp->number)=data;
tmp->number++;
}

void printf_data_of_list(list head,int num[])
{
int i=0,j=0,count=0;
list tmp = head->next;
for(j=0;j<10;j++)
{
printf("the data in list %d are",j);
for(i=0;i<tmp->number;i++)
{
printf("--%3d--",*(tmp->data+i));
num[count++]=*(tmp->data+i);
}
tmp = tmp->next;
printf("\n");
}
printf("the nun[] are");
for(j=0;j<10;j++)
{
printf("--%d--",num[j]);
}
printf("\n");
tmp=head->next;
for(i=0;i<10;i++)
{
tmp->number = 0;
tmp = tmp->next;
}
}

#endif


 

cas.c

/************************************************************************
*	File Name 			:multi card sort
*	Copyright			:scut,All Rights Reserved.
*	Create Data			:2012/11/20
*	Author				:lumotuwe
*	Abstruct Description		:
*
************************************************************************/

#include<stdio.h>
#include<string.h>
#include "cas.h"
#include<stdlib.h>
int main(int argc, char ** argv)
{
int max,lev0;
list head,tmp;
int i,j,len,num[100];
for(i=0;i<=99;i++) num[i]=0;
if(argc != 11)
printf("input erro\n");
/*
Converting string to int;
*/
for(i=1 ; i<=argc-1 ;i++)
{
len = strlen(argv[i]);
for(j=0; j<len; )
{
num[i-1]+=(int)(argv[i][j]-48);
if(j<len-1)num[i-1]*=10;
j++;
}
}
//init the head pointer
head = (struct cardsort *)malloc(sizeof(struct cardsort));
head->number = 10;
//init for list
tmp = head;
for(i=0;i<=9;i++)
{
tmp->next = (struct cardsort *)malloc(sizeof(struct cardsort));
tmp = tmp->next;
tmp->number = 0;
tmp->next   = NULL;
tmp->data   =(int *)malloc(40);
}
//the first step to card sort
for(i=0;i<=9;i++)
{
lev0 = num[i]%10;
switch (lev0)
{
case 0 : send_data_to_list(num[i],1,head);break;
case 1 : send_data_to_list(num[i],2,head);break;
case 2 : send_data_to_list(num[i],3,head);break;
case 3 : send_data_to_list(num[i],4,head);break;
case 4 : send_data_to_list(num[i],5,head);break;
case 5 : send_data_to_list(num[i],6,head);break;
case 6 : send_data_to_list(num[i],7,head);break;
case 7 : send_data_to_list(num[i],8,head);break;
case 8 : send_data_to_list(num[i],9,head);break;
case 9 : send_data_to_list(num[i],10,head);break;
}
}
printf("the result of the first step to card sort\n");
printf_data_of_list(head,num);
printf("------------------------------------------\n");
//the second step to card sort
for(i=0;i<=9;i++)
{
lev0 = (num[i]/10)%10;
switch (lev0)
{
case 0 : send_data_to_list(num[i],1,head);break;
case 1 : send_data_to_list(num[i],2,head);break;
case 2 : send_data_to_list(num[i],3,head);break;
case 3 : send_data_to_list(num[i],4,head);break;
case 4 : send_data_to_list(num[i],5,head);break;
case 5 : send_data_to_list(num[i],6,head);break;
case 6 : send_data_to_list(num[i],7,head);break;
case 7 : send_data_to_list(num[i],8,head);break;
case 8 : send_data_to_list(num[i],9,head);break;
case 9 : send_data_to_list(num[i],10,head);break;
}
}
printf("the result of the second step to card sort\n");
printf_data_of_list(head,num);
printf("------------------------------------------\n");
//the third step to card sort
for(i=0;i<=9;i++)
{
lev0 = num[i]/100;
switch (lev0)
{
case 0 : send_data_to_list(num[i],1,head);break;
case 1 : send_data_to_list(num[i],2,head);break;
case 2 : send_data_to_list(num[i],3,head);break;
case 3 : send_data_to_list(num[i],4,head);break;
case 4 : send_data_to_list(num[i],5,head);break;
case 5 : send_data_to_list(num[i],6,head);break;
case 6 : send_data_to_list(num[i],7,head);break;
case 7 : send_data_to_list(num[i],8,head);break;
case 8 : send_data_to_list(num[i],9,head);break;
case 9 : send_data_to_list(num[i],10,head);break;
}
}
printf("the result of the third step to card sort\n");
printf_data_of_list(head,num);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息