多趟桶式排序bucket sort

      如果有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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章