TOP K I

来源:互联网 发布:淘宝修真记全集下载 编辑:程序博客网 时间:2024/06/05 22:52

问题:求一维数组中最小的k个数。

时间复杂度为O(n)的OC算法实现:

////  TopKI.h//  Algorithm////  Created by han shuai on 2016/9/26.//  Copyright © 2016年 han shuai. All rights reserved.///** 12 */#import <Foundation/Foundation.h>@interface TopKI : NSObject- (NSArray *)topk:(NSMutableArray *)dataArr k:(int)k;@end

////  TopKI.m//  Algorithm////  Created by han shuai on 2016/9/26.//  Copyright © 2016年 han shuai. All rights reserved.//#import "TopKI.h"@implementation TopKI- (NSArray *)topk:(NSMutableArray *)dataArr k:(int)k{    NSInteger start = 0;    NSInteger end = dataArr.count-1;    NSInteger index = [self partition:dataArr start:start end:end];    while (index != k-1) {        if (index > k-1) {            end = index -1;            index = [self partition:dataArr start:start end:end];        }        else{            start = index+1;            index = [self partition:dataArr start:start end:end];        }    }        return [dataArr objectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, k)]];}- (NSInteger)partition:(NSMutableArray *)dataArr start:(NSInteger)start end:(NSInteger)end{    if (start > end) {        return -1;    }        NSInteger index = start;//可随机选择pivot,不一定是第一个元素    //第一次交换    [self swap:dataArr i:index j:end];    for (NSInteger i = start; i <end; i++) {        if ([dataArr[i] intValue] < [dataArr[end] intValue]) {            if (i!=index) {                [self swap:dataArr i:index j:i];            }            index++;        }    }        [self swap:dataArr i:index j:end];        return index;}- (void)swap:(NSMutableArray *)dataArr i:(NSInteger)i j:(NSInteger)j{    NSNumber *temp = dataArr[i];    dataArr[i] = dataArr[j];    dataArr[j] = temp;}@end


0 0
原创粉丝点击