数据结构与算法八: 7)排序算法--基数排序

296 阅读3分钟

这是我参与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

第一轮.png

第二轮排序:先将桶中的数据清空,再按照十位上的值分配桶,根据十位数的值放入对应下标的桶中,如下图,然后从 0-9 这 10个桶中,按照加入顺序依次取出(先进先出),重新放入数组中,这时数组的的顺序为 3,14,214,542,748,53

第二轮.png

第三轮排序:先将桶中的数据清空,再按照百位上的值分配桶,根据百位数的值放入对应下标的桶中,如下图,然后从 0-9 这 10个桶中,按照加入顺序依次取出(先进先出),重新放入数组中,这时数组的的顺序为 3,14,53,214,542,748

第三轮.png

基数排序的完整代码

//基数排序
-(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;
}

基数排序的性能

截屏2021-08-10 15.29.10.png

d代表数组元素最高为位数,n代表元素个数。

其他排序算法

排序算法:1)直接插入排序

排序算法:2)希尔排序

排序算法:3)冒泡排序

排序算法:4)快速排序

排序算法:5)选择排序

排序算法:6)归并排序

排序算法:7)基数排序

排序算法:8)堆排序