@implementation Sort
// 冒泡排序
// 依次两两相比,大的挪后边
+ (NSMutableArray *)bubbleSort:(NSArray *)array {
NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
for (int end = (int)marray.count - 1; end > 0 ; end--) {
for (int begin = 0; begin < end; begin++) {
if (marray[begin] < marray[begin+1]) {
[marray exchangeObjectAtIndex:begin withObjectAtIndex:begin+1];
}
}
}
return marray;
}
// 选择排序
// 从序列中找到最大的元素,然后和最末尾的元素交换
+ (NSMutableArray *)selectionSort:(NSArray *)array {
NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
for (int end = (int)(marray.count)-1; end>0; end--) {
NSInteger maxIndex = 0;
for (int begin = 1; begin <= end; begin++) {
if (marray[maxIndex] < marray[begin]) {
maxIndex = begin;
}
}
[marray exchangeObjectAtIndex:maxIndex withObjectAtIndex:end];
}
return marray;
}
// 插入排序
// 每次选择排好序的后一个数据与前边排好序的每一个进行比较
+ (NSMutableArray *)insterSort:(NSArray *)array {
NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
for (int begin = 1; begin <= marray.count; begin++) {
int end = begin-1;
while (end>0) {
if ([marray[end] integerValue] < [marray[end-1] integerValue]) {
[marray exchangeObjectAtIndex:end withObjectAtIndex:end-1];
}
end--;
}
}
return marray;
}
+ (NSMutableArray *)quickSort:(NSArray *)array {
NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
return marray;
}
// 二叉堆排序
+ (NSMutableArray *)heapSort:(NSArray *)array {
NSMutableArray *marray = [NSMutableArray arrayWithArray:array];
int heapSize = (int)marray.count;
// 原地建堆
for (int i = (heapSize >> 1) - 1; i >= 0; i--) {
[Sort siftDown:i array:marray heapSize:heapSize];
}
// 此时,第一个元素是最大的.
while (heapSize > 1) {
// 交换第0 个元素 和 最后一个元素 最大的元素去到末尾
[marray exchangeObjectAtIndex:0 withObjectAtIndex:--heapSize];
[Sort siftDown:0 array:marray heapSize:heapSize];
}
return marray;
}
// 下虑 恢复二叉堆的性质 (这里用的是大顶堆)
+ (void)siftDown:(int)index array:(NSMutableArray *)array heapSize:(int)heapSize{
NSInteger element = [array[index] integerValue];
// 第一个叶子结点的索引
int half = heapSize >> 1;
while (index < half){
// 默认先取左子节点
int childIndex = (index << 1) + 1;
NSInteger child = [array[childIndex] integerValue];
// 右子节点
int rightIndex = childIndex+1;
// 右边比较大
if ((NSInteger)array[rightIndex] - child > 0){
childIndex = rightIndex;
child = (NSInteger)array[rightIndex];
}
// 节点比左右节点都大,跳出循环
if ((element - child) >= 0 ) break;
// 否则, 子节点上去
array[index] = @(child);
// 记录要替换的位置
index = childIndex;
}
array[index] = @(element);
}
@end