十大排序算法-排序
- (int)cmp:(NSArray *)array idx:(int)idx idx1:(int)idx1{
return [array[idx] intValue] - [array[idx1] intValue];
}
- (void)swap:(NSMutableArray *)array idx:(int)idx idx1:(int)idx1 {
NSNumber *temp = array[idx];
array[idx] = array[idx1];
array[idx1] = temp;
}
- (void)siftDownArray:(NSMutableArray *)array
index:(int)index
heapSize:(int)heapSize{
NSNumber *element = array[index];
int half = heapSize >> 1;
while (index < half) { // index必须是非叶子节点
// 默认是左边跟父节点比
int childIndex = (index << 1) + 1;
NSNumber *child = array[childIndex];
int rightIndex = childIndex + 1;
// 右子节点比左子节点大
if (rightIndex < heapSize && [self cmp:array idx:rightIndex idx1:childIndex] >0) {
child = array[childIndex = rightIndex];
}
// 大于等于子节点
if ([self cmp:array idx:index idx1:childIndex] >= 0) break;
array[index] = child;
index = childIndex;
}
array[index] = element;
}
1. 冒泡排序n2
- (void)bubupsort {
NSMutableArray *array = [NSMutableArray array];
[array addObjectsFromArray:@[@1, @2, @44, @7, @5, @3 ,@32 ,@5 ,@6 ,@7 ,@0]];
for (int end = (int)array.count - 1; end > 0 ;end --) {
for (int begin = 1; begin <= end ; begin++) {
if ([self cmp:array idx:begin idx1:begin-1] < 0) {
[self swap:array idx:begin idx1:begin-1];
}
}
}
NSLog(@"%@",array);
}
2.选择排序n2,选择排序交换次数远远小于冒泡排序
- (void)selectSort {
NSMutableArray *array = [NSMutableArray array];
[array addObjectsFromArray:@[@1, @2, @44, @7, @5, @3 ,@32 ,@5 ,@6 ,@7 ,@0]];
for (int end = (int)array.count - 1; end > 0 ;end --) {
int max = 0;
for (int begin = 1; begin <= end ; begin++) {
if ([self cmp:array idx:max idx1:begin] < 0) {
max = begin;
}
}
[self swap:array idx:max idx1:end];
}
NSLog(@"%@",array);
}
堆排序 logn 可以看做选择排序的优化
- (void)heapSort{
NSMutableArray *array = [NSMutableArray array];
[array addObjectsFromArray:@[@1, @2, @44, @7, @5, @3 ,@32 ,@5 ,@6 ,@7 ,@0]];
// 原地建堆
int heapSize = (int)array.count;
for (int i = (heapSize >> 1) - 1; i >= 0; i--) {
[self siftDownArray:array index:i heapSize:heapSize];
}
while (heapSize > 1) {
// 交换堆顶元素和尾部元素
[self swap:array idx:0 idx1:--heapSize];
// 对0位置进行siftDown(恢复堆的性质)
[self siftDownArray:array index:0 heapSize:heapSize];
}
NSLog(@"%@",array);
}
- (void)insertSort {
NSMutableArray *array = [NSMutableArray array];
[array addObjectsFromArray:@[@1, @2, @44, @7, @5, @3 ,@32 ,@5 ,@6 ,@7 ,@0]];
for(int begin = 1; begin<array.count; begin++) {
int cur = begin;
while (cur > 0 && [self cmp:array idx:cur idx1:cur-1]<0) {
[self swap:array idx:cur idx1:cur-1];
cur--;
}
}
NSLog(@"%@",array);
}
浙公网安备 33010602011771号