数据结构_基数排序

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

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>

/*
基数排序,使用记数排序,递归的从最低位到最高为进行排序
*/

/*这里我们只考虑十进制数*/

/*基数排序,一般使用在都是同样的位数的数进行排序*/

/*由于是十进制的数,所以都是小于等于9的数*/

/*基数排序的时间复杂度,跟多少位数有关系,比如我们用d来表示位数,k来表示每位数字都是介于0到K-1之间的数,n 个数进行排序

则时间复杂度为 d*(n+k) */
#define k 10

static int iwei_shu = 3;

 

int paixu_jishu(int a[],int ilength){

 int j = 0;

 int c[k];

 char chtemp[3];


    /*分配临时空间,大小和待排序的数据空间大小一致*/
 int *b = (int *)malloc(sizeof(int)*ilength);

 int *atemp = (int *)malloc(sizeof(int)*ilength);

 /*依次从最低位开始取得数字,转换为整数,一直到最高位*/
 for(j = 0; j < ilength; j++){
  
  sprintf(chtemp,"%d",a[j]);
  
  atemp[j] = chtemp[iwei_shu - 1] - '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;
 }

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

   c[j] = c[j] + c[j-1]; 
 }

 for(j = 0; j < k; j++){
  
  printf("%d ",c[j]);
 }

 printf("\n");

 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;

 

 }
 printf("\n");

 for(j = 0; j < ilength;j++){
           
      a[j] = b[j];

   printf("%d ",b[j]);
 }

 printf("\n");
 
 free(b);

 return 0;

}

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

    int a[] = {214,323,564,632,790,254,316,603,691,709,545};

 int i = 0;

 int ilength = 0;

 ilength = sizeof(a) / 4;

    /*打印排序前数据*/
 for(i = 0; i < ilength; i++){
  
  printf("%d ",a[i]);   
  
 }
 
 printf("\n");

     /*从最低位开始进行记数排序*/ 
 while(iwei_shu != 0){

  paixu_jishu(a,ilength);

  iwei_shu--;

 }

 /*打印排序后数据*/
 for(i = 0; i < ilength; i++){
  
  printf("%d ",a[i]);   
  
 }
 
 printf("\n");

 
 

 return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值