桶排序

作者: 点滴86 | 来源:发表于2024-08-14 22:24 被阅读0次

桶排序(Bucket Sort)

桶排序核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据在单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。


代码实现如下(需要用到上一节中的快速排序,就不贴代码了):
@interface DMBucketSort : NSObject

// 桶排序
- (void)bucketSort;

@end

@interface DMBucket : NSObject

@property (nonatomic, assign) NSInteger mStartIndex;

@property (nonatomic, assign) NSInteger mEndIndex;

@property (nonatomic, strong) NSMutableArray *mDataArray;

- (BOOL)inRange:(NSNumber *)valueNum;

@end

@implementation DMBucket

- (NSMutableArray *)mDataArray
{
    if (_mDataArray == nil) {
        _mDataArray = [[NSMutableArray alloc] init];
    }
    return _mDataArray;
}

// 判断valueNum 是否在桶区间中
- (BOOL)inRange:(NSNumber *)valueNum
{
    BOOL bFlag = NO;
    if ([valueNum integerValue] >= self.mStartIndex && [valueNum integerValue] <= self.mEndIndex) {
        bFlag = YES;
    }
    
    return bFlag;
}

@end

@implementation DMBucketSort

// 桶排序 金额在0-50之间的订单进行桶排序
- (void)bucketSort
{
    NSMutableArray *dataArray = [[NSMutableArray alloc] init];
    [dataArray addObject:[NSNumber numberWithInteger:22]];
    [dataArray addObject:[NSNumber numberWithInteger:5]];
    [dataArray addObject:[NSNumber numberWithInteger:11]];
    [dataArray addObject:[NSNumber numberWithInteger:41]];
    [dataArray addObject:[NSNumber numberWithInteger:45]];
    [dataArray addObject:[NSNumber numberWithInteger:26]];
    [dataArray addObject:[NSNumber numberWithInteger:29]];
    [dataArray addObject:[NSNumber numberWithInteger:10]];
    [dataArray addObject:[NSNumber numberWithInteger:7]];
    [dataArray addObject:[NSNumber numberWithInteger:8]];
    [dataArray addObject:[NSNumber numberWithInteger:30]];
    [dataArray addObject:[NSNumber numberWithInteger:27]];
    [dataArray addObject:[NSNumber numberWithInteger:42]];
    [dataArray addObject:[NSNumber numberWithInteger:43]];
    [dataArray addObject:[NSNumber numberWithInteger:40]];
    
    NSLog(@"桶排序前数据: %@", [dataArray componentsJoinedByString:@"  "]);
    
    NSMutableArray *bucketArray = [[NSMutableArray alloc] init];
    // 根据金额在0-50,创建五个桶
    for (NSInteger i = 0; i < 5; i++) {
        DMBucket *bucket = [[DMBucket alloc] init];
        bucket.mStartIndex = i * 10;
        bucket.mEndIndex = i * 10 + 9;
        
        [bucketArray addObject:bucket];
    }
    
    // 将原始数据根据桶区间放入对应的桶中
    for (NSInteger i = 0; i < [dataArray count]; i++) {
        NSNumber *numValue = [dataArray objectAtIndex:i];
        for (DMBucket *bucket in bucketArray) {
            if ([bucket inRange:numValue]) {
                [bucket.mDataArray addObject:numValue];
            }
        }
    }
    
    // 利用快速排序对桶中数据进行排序
    for (DMBucket *bucket in bucketArray) {
        DMQuickSort *quickSort = [[DMQuickSort alloc] init];
        [quickSort quickSort:bucket.mDataArray];
    }
    
    // 将桶中排序好的数据拷贝到数组中
    NSMutableArray *resultArray = [[NSMutableArray alloc] init];
    for (DMBucket *bucket in bucketArray) {
        [resultArray addObjectsFromArray:bucket.mDataArray];
    }
    
    NSLog(@"桶排序后数据: %@", [resultArray componentsJoinedByString:@"  "]);
}

@end


桶排序的时间复杂度分析
如果要排序的数据有n个,把它们均匀地划分到m个桶内,每个桶里就有K=n/m个元素。每个桶内部使用快速排序,时间复杂度为O(K * logK)。m个桶排序的时间复杂度就是O(m * K * logK),因为K=n/m,所以整个桶排序的时间复杂度就是O(n * log(n/m))。当桶的个数m接近数据个数n时,log(n/m)就是一个非常小的常量,这个时候桶排序的时间复杂度接近O(n)。

相关文章

  • 算法基础 排序(一)

    桶排序冒泡排序快速排序 1.桶排序 所谓的桶排序就是列出所有的可能进行排序 小结:这里的桶排序只是简化版的.桶排序...

  • 《数据结构与算法之美》10——排序(三)桶排序、计数排序、基数排

    桶排序 概念 桶排序,核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排序之后,再把...

  • 桶排序

    什么是桶排序桶排序是计数排序的衍化桶排序需要创建若干个桶来装元素协助排序。每一个桶(bucket)代表一个区间范围...

  • 桶排序,计数排序和基数排序

    桶排序 桶排序的核心思路 桶排序的核心处理思想是先定义几个有序的桶,将要排序的数组按照桶划分的值的范围分到这几个桶...

  • 桶排序与哈希桶排序

    一.桶排序 算法原理 桶排序 (箱排序)的原理是将待排序序列分到有限数量的桶里面,然后对每个桶再分别排序(可以使用...

  • php-计数排序、基数排序、桶排序

    计数排序、基数排序、桶排序 时间复杂度 O(n) 计数排序 基数排序 桶排序

  • 数组-桶排序

    采用桶排序方式对数组进行排序 桶排序百科:桶排序(Bucket Sort),或者所谓的箱排序是一种非比较排序.工作...

  • 13|桶排序

    桶排序( Bucket sort )首先,我们来看桶排序。桶排序,顾名思义,会用到 “ 桶 ” ,核心思想是将要排...

  • 线性排序

    桶排序 核心思想是将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序。桶内排序完之后,再把每个桶里的数...

  • 排序算法(3)- 桶排序、计数排序、基数排序

    桶排序(Bucket sort) 将要排序的数据分到几个有序的桶里,每个桶里面再单独进行排序,最后把每个桶里的数据...

网友评论

      本文标题:桶排序

      本文链接:https://www.haomeiwen.com/subject/rqnskjtx.html