zoukankan      html  css  js  c++  java
  • 桶排序算法

    桶排序算法(BucketSort)

    工作的原理:将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。

    代码如下:

    QuickSort.c文件如下:

    #include "QuickSort.h"
    
    void QuickSort(double R[],int s,int t)//使数据最快的达到目的位置;是随机选择一个数,还是选择第一个数,
                                       //肯定选择第一个操作简单,但是效率不见得高
    {
        int i, j;
        double temp;
        if(s>=t)  //只剩一个数据的时候返回
            return;
        i=s, j=t;
        temp=R[s];
        while(i!=j)
        {
            while((j>i) && (R[j]>temp))//先从后边操作的原因是可以与第一个交换,
                                       //因为第一个数已经保存在temp里了,以此类推,每次交换覆盖的都是垃圾值
            {
                j--;
            }
            if(i<j)
            {
                R[i]=R[j];
                i++;
            }
            while((i<j) && (R[i]<temp))
            {
                i++;
            }
            if(i<j)
                R[j--]=R[i];//先赋值,再自减
        }
        R[i]=temp;//R[j]=temp;也行
        QuickSort(R, s, i-1);
        QuickSort(R, i+1, t);
    }

    QuickSort.h文件如下:

    #ifndef _QUICKSORT_H_
    #define _QUICKSORT_H_
    
    void QuickSort(double f[],int s,int t);
    
    #endif //_QUICKSORT_H_

    BucketSort.c文件如下:

    /*
    在随机产生的空间大小分别为
    N = 10, 1000,10000,100000
    排序样本取值为[0,1),分成10个桶
    */
    #include "BucketSort.h"
    #include "QuickSort.h"
    #include <string.h>
    #include <stdlib.h>
    
    #define BUCKET_NUM 10 //桶的数目
    
    void BucketSort(double fArray[],int length)
    {
        int i,m=0; //m表示指针偏移量
        int nSize = sizeof(*fArray)*length;
        int n[BUCKET_NUM];
        double* f[BUCKET_NUM];//定义一个指针数组
    
        for(i=0;i<BUCKET_NUM;i++)//申请内存,用作桶,共BUCKET_NUM
        {
            f[i] = (double*)malloc(nSize); 
        }
        for(i=0;i<BUCKET_NUM;i++)//每个桶内的元素数目,初始化为0
        {
            n[i] = 0; 
        }
         //f[0]  [0  ,0.1)一般来说都会申请成功
         //f[1]  [0.1,0.2)
         //f[2]  [0.2,0.3)
         //f[3]  [0.3,0.4)
         //f[4]  [0.4,0.5)
         //f[5]  [0.5,0.6)
         //f[6]  [0.6,0.7)
         //f[7]  [0.7,0.8)
         //f[8]  [0.8,0.9)
         //f[9]  [0.9,  1)
    
        for(i=0; i<length; i++)
        {
            if(0<=fArray[i] && fArray[i]<0.1)
            {
                *(f[0]+n[0])=fArray[i];
                n[0]++;
            }
            else if(0.1<=fArray[i] && fArray[i]<0.2)
            {
                f[1][n[1]]=fArray[i];
                n[1]++;
            }
            else if(0.2<=fArray[i] && fArray[i]<0.3)
            {
                f[2][n[2]]=fArray[i];
                n[2]++;
            }
            else if(0.3<=fArray[i] && fArray[i]<0.4)
            {
                f[3][n[3]]=fArray[i];
                n[3]++;
            }
            else if(0.4<=fArray[i] && fArray[i]<0.5)
            {
                f[4][n[4]]=fArray[i];
                n[4]++;
            }
            else if(0.5<=fArray[i] && fArray[i]<0.6)
            {
                f[5][n[5]]=fArray[i];
                n[5]++;
            }
            else if(0.6<=fArray[i] && fArray[i]<0.7)
            {
                f[6][n[6]]=fArray[i];
                n[6]++;
            }
            else if(0.7<=fArray[i] && fArray[i]<0.8)
            {
                f[7][n[7]]=fArray[i];
                n[7]++;
            }
            else if(0.8<=fArray[i] && fArray[i]<0.9)
            {
                f[8][n[8]]=fArray[i];
                n[8]++;
            }
            else //if(0.9<=fArray[i] && fArray[i]<1)
            {
                f[9][n[9]]=fArray[i];
                n[9]++;
            }
        }
    
        //桶内使用快速排序
        for(i=0;i<BUCKET_NUM;i++)
        {
            QuickSort(f[i], 0, n[i]-1);
        }
    
        //桶内排列好的数据复制到原数组
        for(i=0;i<BUCKET_NUM;i++)
        {
            if(n[0]>0)
            {
                memcpy(fArray+m,f[i],sizeof(*fArray)*n[i]);
                m+=n[i];
            }
        }
    
        //释放malloc分配的内存
        for(i=0;i<BUCKET_NUM;i++)
        {
            free(f[i]);
        }
    }

    BucketSort.h文件如下:

    #ifndef _BUCKETSORT_H_
    #define _BUCKETSORT_H_
    
    void BucketSort(double fArray[],int length);
    
    #endif // _BUCKETSORT_H_

    Test.c文件如下:

    #include "BucketSort.h"
    #include <stdio.h>
    
    int main()
    {
        double fArray[] = {0.08, 0.52, 0.64, 0.25, 0.06, 0.98, 0.91, 0.36, 0.44, 0.17};//float肯定会有警告,因为0.1默认存为double型的
        int i,length;
        length = sizeof(fArray)/sizeof(*fArray);
    
        BucketSort(fArray,length);
    
        for(i=0;i<length;i++)
            printf("%f ",fArray[i]);
        return 0;
    }
  • 相关阅读:
    相似性算法研究
    CNN实战篇-手把手教你利用开源数据进行图像识别(基于keras搭建)
    主流NoSQL数据库的分析与选择
    CentOS7下防火墙相关命令
    Error:(10, 32) java: 程序包org.springframework.xxxl不存在
    Windows下IDEA上传码云push的时候出现push to origin/master was rejected
    SpringBoot配置mybatis使用的两种方式
    SpringBoot+Mybatis-plus测试时碰到的奇怪时区问题
    Java String 在拼接时的编译器优化
    Java Maven项目更新后jdk版本变为1.5
  • 原文地址:https://www.cnblogs.com/wufengv5/p/3086797.html
Copyright © 2011-2022 走看看