您的位置:首页 > 理论基础 > 数据结构算法

数据结构_基数排序

2013-01-04 19:57 375 查看
// 数据结构_基数排序.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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: