• 桶排序算法


    桶排序算法(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;
    }
  • 相关阅读:
    scrapy爬虫框架实例二
    查看系统信息
    scrapy中ROBOTSTXT_OBEY = True的相关说明
    scrapy爬虫框架实例一,爬取自己博客
    一个节点rac+单节点dg网络配置(listener.ora与tnsnames.ora)
    lsnrctl启动报错,Linux Error: 29: Illegal seek
    单机11g ogg 双向DML复制
    OGG 进程清除、重建
    OGG 11g Checkpoint 详解
    ogg日常运维命令
  • 原文地址:https://www.cnblogs.com/wufengv5/p/3086797.html
Copyright © 2020-2023  润新知