大数跨境
0
0

桶排序

桶排序 Social Companion
2018-09-28
0
导读:同计数排序一样,桶排序也对待排序序列作了假设,桶排序假设序列由一个随机过程产生,该过程将元素均匀而独立地分布

同计数排序一样,桶排序也对待排序序列作了假设,桶排序假设序列由一个随机过程产生,该过程将元素均匀而独立地分布在区间[0,1)上。基本思想是:把区间[0,1)划分成n个相同大小的子区间,称为桶。将n个记录分布到各个桶中去。如果有多于一个记录分到同一个桶中,需要进行桶内排序。最后依次把各个桶中的记录列出来记得到有序序列。

小哼的班上只有5个同学,这5个同学分别考了5分、3分、5分、2分和8分,哎,考得真是惨不忍睹(满分是10分)。接下来将分数进行从大到小排序

我们这里只需借助一个一维数组就可以解决这个问题。请确定你真的仔细想过再往下看哦。

首先我们需要申请一个大小为11的数组int a[11]。OK,现在你已经有了11个变量,编号从a[0]~a[10]。刚开始的时候,我们将a[0]~a[10]都初始化为0,表示这些分数还都没有人得过。例如a[0]等于0就表示目前还没有人得过0分,同理a[1]等于0就表示目前还没有人得过1分……a[10]等于0就表示目前还没有人得过10分。

我们这里只需借助一个一维数组就可以解决这个问题。请确定你真的仔细想过再往下看哦。

首先我们需要申请一个大小为11的数组int a[11]。OK,现在你已经有了11个变量,编号从a[0]~a[10]。刚开始的时候,我们将a[0]~a[10]都初始化为0,表示这些分数还都没有人得过。例如a[0]等于0就表示目前还没有人得过0分,同理a[1]等于0就表示目前还没有人得过1分……a[10]等于0就表示目前还没有人得过10分。

你发现没有,a[0]~a[10]中的数值其实就是0分到10分每个分数出现的次数。接下来,我们只需要将出现过的分数打印出来就可以了,出现几次就打印几次,具体如下。

a[0]为0,表示“0”没有出现过,不打印。

a[1]为0,表示“1”没有出现过,不打印。

a[2]为1,表示“2”出现过1次,打印2。

a[3]为1,表示“3”出现过1次,打印3。

a[4]为0,表示“4”没有出现过,不打印。

a[5]为2,表示“5”出现过2次,打印5 5。

a[6]为0,表示“6”没有出现过,不打印。

a[7]为0,表示“7”没有出现过,不打印。

a[8]为1,表示“8”出现过1次,打印8。

a[9]为0,表示“9”没有出现过,不打印。

a[10]为0,表示“10”没有出现过,不打印。

最终屏幕输出“2 3 5 5 8”

#include <stdio.h> 

    int main()  

    {  

        int a[11],i,j,t;  

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

            a[i]=0;  //初始化为0  

          

        for(i=1;i<=5;i++)  //循环读入5个数  

        {  

            scanf("%d",&t);  //把每一个数读到变量t中  

            a[t]++;  //进行计数  

        }  

     

        for(i=0;i<=10;i++)  //依次判断a[0]~a[10]  

            for(j=1;j<=a[i];j++)  //出现了几次就打印几次  

                printf("%d ",i);  

     

        getchar();getchar();   

        //这里的getchar();用来暂停程序,以便查看程序输出的内容  

        //也可以用system("pause");等来代替  

        return 0;  

    }





#include<stdio.h>

#include<stdlib.h>

 

//桶排序

void bucketSort(double* a,int n)

{

//链表结点描述

typedef struct Node{

double key;

        struct Node * next; 

}Node;

//辅助数组元素描述

typedef struct{

         Node * next;

}Head;

int i,j;

    Head head[10]={NULL};

Node * p;

Node * q;

Node * node;

for(i=1;i<=n;i++){

node=(Node*)malloc(sizeof(Node));

node->key=a[i];

node->next=NULL;

p = q =head[(int)(a[i]*10)].next;

if(p == NULL){

head[(int)(a[i]*10)].next=node;

continue;

}

while(p){

            if(node->key < p->key)

break;

q=p;

p=p->next;

}

if(p == NULL){

q->next=node;

}else{

node->next=p;

q->next=node;

}

}

j=1;

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

    p=head[i].next;

while(p){

a[j++]=p->key;

p=p->next;

}

}

}

 

void main()

{

int i;

double a[13]={0,0.13,0.25,0.18,0.29,0.81,0.52,0.52,0.83,0.52,0.69,0.13,0.16};//不考虑a[0]

bucketSort(a,12);

for(i=1;i<=12;i++)

printf("%-6.2f",a[i]);

printf("\n");

}


【声明】内容源于网络
0
0
Social Companion
信息科技教学,个人思考随感的在线记事本
内容 791
粉丝 0
Social Companion 信息科技教学,个人思考随感的在线记事本
总阅读117
粉丝0
内容791