数据结构_基数排序
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;
}
//
#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;
}
相关文章推荐
- 10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
- 数据结构系列之基数排序
- 数据结构_内部排序_链式基数排序
- C++代码,数据结构-内部排序-基数排序-链式基数排序
- Hark的数据结构与算法练习之基数排序
- 数据结构-算法: 分配排序(基数分配排序法)
- 数据结构-算法: 基数排序
- 【数据结构】算法10.15-10.17 链式基数排序
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- 数据结构 28 排序 计数排序 基数排序 桶排序
- 重学数据结构002——桶排序、基数排序
- 第16周SHH数据结构-【项目1-验证算法(8)基数排序 】
- 数据结构——链式基数排序
- 数据结构之基数排序
- 数据结构-算法: 分配排序(基数分配排序法)
- 数据结构 学习笔记(十一):排序(下):快速 / 表 / 桶 / 基数 排序,排序算法的比较
- Java 数据结构和算法 排序
- 基数排序
- 基数排序 算法
- 数据结构->直接插入排序