原理
利用数组访问的索引实现排序。即把数据映射到数组索引,数组中每个元素表示该索引的数出现的次数。
实现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
/*
* 有100个大于0的数,对其排序
*
*/
int main(){
int datas[101]; //依次存放生成的数据
int rst[101]; //存放排序的数据
memset(datas,0,sizeof(int) * 101);
memset(rst,0,sizeof(int) * 101);
srand(time(NULL));
for(int i=0;i<100;i++){
int tmp = rand() % 99 + 1;
datas[i] = tmp;
rst[tmp] += 1; //记录该数出现次数
}
//未排序的数据
printf("\n----------unsorted----------\n");
for(int i=0;i<100;i++){
printf("%d\t",datas[i]);
}
printf("\n----------sorted----------\n");
for(int i=0;i<100;i++){
for(int j=1;j<=rst[i];j++){
printf("%d\t",i);
}
}
char ch = getchar();
return 0;
}
效果:
总结
数组随机访问效率非常高,代码底层实现中根据 目标元素地址=基地址+(元素大小)*元素索引
即可直接定位需要访问的元素。
很多高级语言容器类如
Java 的ArrayList、Python 的 list 都是基于数组实现
缺点:
对于数据范围不明确将无法使用该排序方法;
数据连续性不好时会浪费内存空间