数据结构_桶排序

// 数据结构_桶排序.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
/*当桶排序的输入符合均匀分布时,即可以以线性期望时间运行*/
/*算发导论中的伪代码*/
/*
BUCKET-SORT(A)
1 n <- length[A]
2 for i <- 1 to n
3    do insert A[i] into list B[|_nA[i]_|]
4 for i <- 0 to n-1
5  do sort list B[i] with insertion sort
6 concatenate the lists B[0],B[1],...,
B[n-1] together in order
桶排序的时间复杂度为N

*/

//定义链表的头
typedef struct LNODE{

  float data;

  LNODE *next;


}LNODE,*PLNODE;

//这里,我们定义10个桶,用来存放不同的数据

const int NUMDATA = 10;

#define k 10


int paixu_jishu(float a[],int ilength){
 
 int j = 0;
 
 int c[k];
 
 char chtemp[4];
 
 
    /*分配临时空间,大小和待排序的数据空间大小一致*/
 float *b = (float *)malloc(sizeof(float)*ilength);
 
 int *atemp = (int *)malloc(sizeof(int)*ilength);
 
 /*依次从最低位开始取得数字,转换为整数,一直到最高位*/
 for(j = 0; j < ilength; j++){
  
  sprintf(chtemp,"%02f",a[j]);
  
  atemp[j] = chtemp[3] - '0';
  
  
 }
 
 
    /*计数的数组进行清0*/
 for(j = 0; j < k; j++){
  
  c[j] = 0;
 }
   
 /*分别得到等于0,1,2,3.....一直到9的数字个数*/
 for(j = 0;j < ilength;j++){
  
  
  c[atemp[j]] = c[atemp[j]] + 1;
 }
 

    /*分别得到小于等于0,1,2,3.....一直到9的数字个数*/
 for(j = 1; j < k; j++){
  
  c[j] = c[j] + c[j-1];
 }
 

 
 for(j = ilength - 1; j >= 0; j--){
  // 注意这里跟计数排序有点不一样,因为我们是多位数,计数排序是b[c[atemp[j]] - 1] = atemp[j];
  b[c[atemp[j]] - 1] = a[j];
  
  c[atemp[j]] = c[atemp[j]] - 1;
  
  
  
 }

 for(j = 0; j < ilength;j++){
  
  a[j] = b[j];
  
 
 }
 
 free(b);
 free(atemp);
 
 return 0;
 
}

int main(int argc, char* argv[])
{

 int iList_len[10];

 int x = 0;

 /*用算法导论中的,待排序的数据,进行举例*/

 float a[] ={0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68};

 int iLength = 0;

 int iCycle = 0;

 float *b[10];

 PLNODE pHeadnode[NUMDATA];

 PLNODE pTempNode[NUMDATA];

 PLNODE pNode = NULL;

 iLength = sizeof(a) / 4;

 printf("\n");

 /*给每个头结点和临时结点分配空间,并答应待排序的数据*/

 for(iCycle = 0; iCycle < iLength; iCycle++){

  pHeadnode[iCycle] = (LNODE *)malloc(sizeof(LNODE));

  pTempNode[iCycle] = (LNODE *)malloc(sizeof(LNODE));

  iList_len[iCycle] = 0;

  printf(" %02f ",a[iCycle]);
 }

 printf("\n");
  
    // 将数据放进不同的桶中,这个数据应该有函数,后续再修改。
 for(iCycle = 0; iCycle < iLength; iCycle++){


  if((a[iCycle] >= 0.0) && (a[iCycle] < 0.1)){

    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[0])
    {
      pHeadnode[0] = pNode;

      pTempNode[0] = pNode;
    }
    else
    {
     pHeadnode[0] -> next = pNode;

     pHeadnode[0] = pHeadnode[0] ->next;
      
    }
     iList_len[0]++;

     pNode ->data = a[iCycle];

  } 
  if((a[iCycle] >= 0.1) && (a[iCycle] < 0.2)){
   
   pNode = (LNODE *)malloc(sizeof(LNODE));

   pNode = (LNODE *)malloc(sizeof(LNODE));
   
   if(0 == iList_len[1])
   {
    pHeadnode[1] = pNode;
    
    pTempNode[1] = pNode;
   }
   else
   {
    pHeadnode[1] -> next = pNode;
    
    pHeadnode[1] = pHeadnode[1] ->next;
    
   }
   iList_len[1]++;
   
   pNode ->data = a[iCycle];
 
  }
  if((a[iCycle] >= 0.2) && (a[iCycle] < 0.3)){
   
    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[2])
    {
      pHeadnode[2] = pNode;

      pTempNode[2] = pNode;
    }
    else
    {
     pHeadnode[2] -> next = pNode;
     
     pHeadnode[2] = pHeadnode[2] ->next;
     
    }
    iList_len[2]++;
    
    pNode ->data = a[iCycle];
  
  } 
  if((a[iCycle] >= 0.3) && (a[iCycle] < 0.4)){
   
    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[3])
    {
      pHeadnode[3] = pNode;

      pTempNode[3] = pNode;
    }
    else
    {
     pHeadnode[3] -> next = pNode;
     
     pHeadnode[3] = pHeadnode[3] ->next;
     
    }
     iList_len[3]++;
    
     pNode ->data = a[iCycle];

   
  } 
  if((a[iCycle] >= 0.4) && (a[iCycle] < 0.5)){
   
    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[4])
    {
      pHeadnode[4] = pNode;

      pTempNode[4] = pNode;
    }
    else
    {
     pHeadnode[4] -> next = pNode;
     
     pHeadnode[4] = pHeadnode[4] ->next;
     
    }
     iList_len[4]++;
    
     pNode ->data = a[iCycle];
   
  } 
  if((a[iCycle] >= 0.5) && (a[iCycle] < 0.6)){
   
    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[5])
    {
      pHeadnode[5] = pNode;

      pTempNode[5] = pNode;
    }
    else
    {
     pHeadnode[5] -> next = pNode;
     
     pHeadnode[5] = pHeadnode[5] ->next;
     
    }
     iList_len[5]++;
    
     pNode ->data = a[iCycle];
  } 
  if((a[iCycle] >= 0.6) && (a[iCycle] < 0.7)){
   
    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[6])
    {
      pHeadnode[6] = pNode;

      pTempNode[6] = pNode;
    }
    else
    {
     pHeadnode[6] -> next = pNode;
     
     pHeadnode[6] = pHeadnode[6] ->next;
     
    }
     iList_len[6]++;
    
     pNode ->data = a[iCycle];

   
   } 
  if((a[iCycle] >= 0.7) && (a[iCycle] < 0.8)){
   
    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[7])
    {
      pHeadnode[7] = pNode;

      pTempNode[7] = pNode;
    }
    else
    {
     pHeadnode[7] -> next = pNode;
     
     pHeadnode[7] = pHeadnode[7] ->next;
     
    }
     iList_len[7]++;
    
     pNode ->data = a[iCycle];

   
   
   } 
  if((a[iCycle] >= 0.8) && (a[iCycle] < 0.9)){
   
    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[8])
    {
      pHeadnode[8] = pNode;

      pTempNode[8] = pNode;
    }
    else
    {
     pHeadnode[8] -> next = pNode;
     
     pHeadnode[8] = pHeadnode[8] ->next;
     
    }
     iList_len[8]++;
    
     pNode ->data = a[iCycle];
  } 
  if((a[iCycle] >= 0.9) && (a[iCycle] < 1.0)){
   
    pNode = (LNODE *)malloc(sizeof(LNODE));
   
    if(0 == iList_len[9])
    {
      pHeadnode[9] = pNode;

      pTempNode[9] = pNode;
    }
    else
    {
     pHeadnode[9] -> next = pNode;
     
     pHeadnode[9] = pHeadnode[9] ->next;
     
    }
     iList_len[9]++;
    
     pNode ->data = a[iCycle];
   
   
   
   } 

 }


 //这里,iList_len[iCycle] 记录了iCycle的桶中的数据个数 pTempNode[iCycle]记录了每个桶的头结点
 //继续排序,我们又要用到基数排序,基数排序又会用到记数排序
    //我们看到对于更多的数据,我们可以用用空间换时间的方法,增加桶的数量,降低时间复杂度


 for(iCycle = 0; iCycle < 10 ; iCycle++){
        
  if(iList_len[iCycle] > 0){

   x = 0;
 
   b[iCycle] = (float *)malloc((sizeof(float))*iList_len[iCycle]);

   while(iList_len[iCycle] > 0){

       b[iCycle][x] = pTempNode[iCycle] ->data;

    pTempNode[iCycle] = pTempNode[iCycle]->next;
    
    iList_len[iCycle]--;
    
    x++;

   }

   paixu_jishu(b[iCycle],x);

   for(int ix = 0; ix < x; ix++){

    printf(" %02f ",b[iCycle][ix]);
   } 


  }
 }


 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值