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