多趟桶式排序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
cas.c
鉴于该算法的缺点,提出了一种多趟桶式排序算法。设我们有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; }
相关文章推荐
- 桶式排序法的C++实现
- 桶式排序(java实现)
- 数据结构——桶式排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 简单的桶式排序-基于数组的实现
- Java排序算法(十):桶式排序 .
- Java排序算法--桶式排序(Bucket Sort)
- 基本排序算法及分析(六):桶式排序
- 对于桶式排序的改进
- 基于桶式排序的基数排序Java实现
- 桶式排序(C语言版)
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- uC/OS-II学习笔记(2012.12.12)任务就绪表和桶式排序
- 桶式排序Java实现
- 桶式排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 桶式排序
- 增加桶式的动态哈希
- 算法篇---桶式排序和基数排序
- c语言写的桶式排序。