buddy算法和k桶算法

 

再读BUDDY算法 http://blog.csdn.net/lights_joy/article/details/2732441

著名的大数量的排序算法--K桶排序法~在数据文本式的大数据排序时,K桶法会是一个不错的选择! k桶法:k桶法有两个主要步骤:分桶,整合。 分桶:把n个数依次放入k个桶中,除了第k个桶外,放入前k 1个桶中的数都要求后一个大于 前一个。分桶的具体规则如下: 第1个数放入第一个桶内,第2个数若大于第一个桶中的数(即第一个数)则放入第一个桶内, 否则放入第二桶内,以此类推。设现要将第j个数放入某桶中,先从第一个桶试起,若第j个 数大于当前第一个桶中最后一个数,则放入第一个桶中,否则试放第二个桶,以此类推,若 前k 1个桶都不能放入,则直接放入第k个桶。 整合:把k个桶中当前排在最前面的数中最小者依次放回到原数组中,直到k个桶空为止。 若整合后的数组已排好序,则算法停止,否则重新分桶、整合,直到排好序为止。

桶排序

  1. 问题描述

有一组n个无序数,用桶排序的方法对其进行排序,输出,编程实现并分析实验结果。

  1. 设计思想

桶排序:预设10个桶标号0-9,用链表实现。对于n个无序数。第1次排序,取每个数第1位放于相应标号的桶中。然后第i次排序(i2开始),从号桶开始取数先放先取出,将数复制到数组中,然后去每个数的第i位,放入相应序号的桶中,依次列推,知道每个数组的位数去完为止。

  1. 编程

#include"stdio.h"

#include"stdlib.h"

#include"math.h"

int a[1000];

int lenth;

struct bucket{

int b;

struct bucket *next;

}bucket_sort[10];

void insert(int n,int i){

struct bucket *pb,*p;

pb=(struct bucket *)malloc(sizeof(struct bucket));

pb->b=n;

pb->next=NULL;

if(!bucket_sort[i].next)bucket_sort[i].next=pb;

else{

    p=bucket_sort[i].next;

    while(p->next){

    p=p->next;

}

        p->next=pb;

}

}

int return_bit(int n,int i){

int k;

k=n;

if(i>1)k=n/(pow(10,(i-1)));

if(k==0&&i!=1)k=-1;

else k=k%10;

return k;

}

void init(){

int i;

for(i=0;i<10;i++){

bucket_sort[i].next=NULL;

}

}

void in_ab(){

int i,j=0;

struct bucket *p;

for(i=0;i<10;i++){

p=bucket_sort[i].next;

while(p){

a[j]=p->b;

p=p->next;

j++;

}

}

init();

}

void bucketsort(){

int sign,i,k,flog=1;

    init();

while(1){

sign=0;

for(i=0;i<lenth;i++){

k=return_bit(a[i],flog);

if(k!=-1){

insert(a[i],k);

sign=1;

}

}

if(sign==0){in_ab();return;}

else in_ab();

flog++;

}

}

void main(){

int i;

printf("Please input the number:");

scanf("%d",&lenth);

printf("Please input :");

for(i=0;i<lenth;i++){

scanf("%d",&a[i]);

}

bucketsort();

for(i=0;i<lenth;i++){

printf("%d ",a[i]);

}

printf("\n");

getch();

}

  1. 结果分析
  1. 结果显示

2.算法优劣

   桶排序算法的时间复杂度为O(n)。在排序算法中比较快,但是桶排序的使用范围比较窄。  

转载于:https://my.oschina.net/ahuaahua/blog/28592

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值