“这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战”
关注我,以下内容持续更新
基数排序
将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
基数排序的方式可以采用 LSD(Least significant digital)或 MSD(Most significant digital),LSD 的排序方式由键值的最右边开始,而 MSD 则相反,由键值的最左边开始。本文采用LSD的方式排序。
例如:将数组 53,3,542,748,14,214 使用基数排序进行升序排序:
首先初始化10个数组(桶)放到一个数组里,10个桶依次有0-9这10个下标,分别代表位数的数值。
第一轮排序:先按照个位上的值分配桶,根据个位数的值放入对应下标的桶中,如下图,然后从 0-9 这 10 个桶中,按照加入顺序依次取出(先进先出),重新放入数组中,这时数组的的顺序为 542,53,3,14,214,748
第二轮排序:先将桶中的数据清空,再按照十位上的值分配桶,根据十位数的值放入对应下标的桶中,如下图,然后从 0-9 这 10个桶中,按照加入顺序依次取出(先进先出),重新放入数组中,这时数组的的顺序为 3,14,214,542,748,53
第三轮排序:先将桶中的数据清空,再按照百位上的值分配桶,根据百位数的值放入对应下标的桶中,如下图,然后从 0-9 这 10个桶中,按照加入顺序依次取出(先进先出),重新放入数组中,这时数组的的顺序为 3,14,53,214,542,748
基数排序的完整代码
//基数排序
-(void)radixSort:(NSMutableArray*)arr{
//1. 获取数组中最大数的位数
int max = [self getMaxBit:arr];
//2.初始化一个桶,桶的序号(下标)分别是 0-9,代表每位数上的值
NSMutableArray<NSMutableArray*> * bucket = [NSMutableArray new];
for (int i = 0; i<10; i++) {
NSMutableArray*a = [NSMutableArray array];
[bucket addObject:a];
}
int index = 1;
int flag = 0;//判断循环结束的条件
while (flag < max) {
flag ++;
//2.把数组按照同一位数值的大小放入桶中
for (int i = 0; i<arr.count; i++) {//5612
int value = [arr[i] intValue] / index % 10;
[bucket[value] addObject:arr[i]];
}
//3.根据某一位重新排序数组
//将原数组清空,重新从桶中添加数据
[arr removeAllObjects];
for (int i = 0; i<bucket.count; i++) {
NSMutableArray*bucketItem = bucket[i];
while (bucketItem.count>0) {
[arr addObject:bucketItem[0]];
[bucketItem removeObjectAtIndex:0];
}
}
index = index*10;
}
}
//获取数组中最大数的位数
-(int)getMaxBit:(NSMutableArray*)arr{
int max = [arr[0] intValue];
for (int i = 1; i<arr.count; i++) {
if (max<[arr[i] intValue]) {
max = [arr[i] intValue];
}
}
NSString*str = [NSString stringWithFormat:@"%d",max];
return (int)str.length;
}
基数排序的性能
d代表数组元素最高为位数,n代表元素个数。