问题:求一维数组中最小的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