排序算法的OC实现

冒泡排序:

+ (NSArray *)bubbleSort:(NSArray<NSNumber *> *)array {
    
    if (!array || [array count] == 0) {
        return nil;
    }
    
    NSLog(@"😈😈😈😈冒泡排序😈😈😈😈");
    
    NSInteger i;
    NSInteger j;
    NSInteger count = [array count];
    
    NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithArray:array];
    
    for (i = 0; i < count - 1; i++) {
        for (j = count - 1; j > i; j--) {
            
            if ([resultArray[j - 1] compare:resultArray[j]] == NSOrderedDescending ) {
                [resultArray exchangeObjectAtIndex:j - 1 withObjectAtIndex:j];
            }
        }
        NSLog(@"第%ld趟:%@", (long)(i + 1), resultArray);
    }
    return [resultArray copy];
}

选择排序:

+ (NSArray *)selectionSort:(NSArray<NSNumber *> *)array {
    if (!array || [array count] == 0) {
        return nil;
    }
    
    NSLog(@"😈😈😈😈选择排序😈😈😈😈");

    NSInteger i;
    NSInteger j;
    NSInteger count = [array count];
    
    NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithArray:array];
    
    for (i = 0; i < count - 1; i++) {
        NSInteger minimum = i;
        for (j = minimum + 1; j < count; j++) {
            if ([resultArray[minimum] compare:resultArray[j]] == NSOrderedDescending) {
                minimum = j;
            }
        }
        [resultArray exchangeObjectAtIndex:i withObjectAtIndex:minimum];
        NSLog(@"第%ld趟:%@", (long)(i + 1), resultArray);
    }
    return [resultArray copy];
}

插入排序:

+ (NSArray *)insertionSort:(NSArray<NSNumber *> *)array {
    
    if (!array || [array count] == 0) {
        return nil;
    }
    
    NSLog(@"😈😈😈😈插入排序😈😈😈😈");

    NSInteger i;
    NSInteger j;
    NSInteger count = [array count];
    
    NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithObject:array[0]];
    
    for (i = 1; i < count; i++) {
        NSInteger insertTag = i;
        for (j = i - 1; j >= 0 && [array[i] compare:resultArray[j]] == NSOrderedAscending; j--) {
            insertTag = j;
        }
        [resultArray insertObject:array[i] atIndex:insertTag];
        NSLog(@"第%ld趟:%@", (long)i, resultArray);
        
    }
    return [resultArray copy];
}

快速排序:

 

void quickSort(NSMutableArray<NSNumber *> *resultArray, NSInteger left, NSInteger right) {
    
    if (left > right) {
        return;
    }
    
    NSInteger i = left;
    NSInteger j = right;
    NSNumber *key = resultArray[left];
    
    while (i != j) {
        
        while (SameOrDes && j > i) {
            j--;
        }
        
        [resultArray exchangeObjectAtIndex:i withObjectAtIndex:j];

        while (SameOrAsc && j > i) {
            i++;
        }
        
        [resultArray exchangeObjectAtIndex:i withObjectAtIndex:j];

    }
    
    quickSort(resultArray, left, i - 1);
    quickSort(resultArray, i + 1, right);
}

+ (NSArray *)quickSort:(NSArray<NSNumber *> *)array left:(NSInteger)left right:(NSInteger)right {
    
    if (!array || [array count] == 0) {
        return nil;
    }
    
    NSLog(@"😈😈😈😈快速排序😈😈😈😈");

    NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithArray:array];
    quickSort(resultArray, left, right);
        
    return [resultArray copy];
    
}

 

 

归并排序:

//归并
void merge(NSMutableArray<NSNumber *> *resultArray, NSMutableArray<NSNumber *> *tempArray, NSInteger left, NSInteger right, NSInteger middle) {
    
    NSInteger leftPoint = left;
    NSInteger rightPoint = middle + 1;
    NSInteger tempPoint = 0;
    
    while (leftPoint <= middle && rightPoint <= right) {
        if ([resultArray[leftPoint] compare:resultArray[rightPoint]] == NSOrderedAscending) {
            tempArray[tempPoint++] = resultArray[leftPoint++];
        }else {
            tempArray[tempPoint++] = resultArray[rightPoint++];
        }
    }
    
    while (leftPoint <= middle) {
        tempArray[tempPoint++] = resultArray[leftPoint++];
    }
    
    while (rightPoint <= right) {
        tempArray[tempPoint++] = resultArray[rightPoint++];
    }
    
    tempPoint = 0;
    //将temp中的元素全部拷贝到原数组中
    while(left <= right){
        resultArray[left++] = tempArray[tempPoint++];
    }
}

//递归拆分后再归并
void mergeSort(NSMutableArray<NSNumber *> *resultArray, NSMutableArray<NSNumber *> *tempArray, NSInteger left, NSInteger right) {
    
    if (left < right) {
        NSInteger middle = (left + right) / 2;
        mergeSort(resultArray, tempArray, left, middle);
        mergeSort(resultArray, tempArray, middle + 1, right);
        merge(resultArray, tempArray, left, right, middle);
    }
}

+ (NSArray *)mergeSort:(NSArray<NSNumber *> *)array {
    
    if (!array || [array count] == 0) {
        return nil;
    }
    
    NSLog(@"😈😈😈😈归并排序😈😈😈😈");

    NSMutableArray<NSNumber *> *resultArray = [NSMutableArray arrayWithArray:array];
    NSMutableArray<NSNumber *> *tempArray = [NSMutableArray arrayWithCapacity:[array count]];
    mergeSort(resultArray, tempArray, 0, [array count] - 1);
    
    return [resultArray copy];
}

未完待续...... 

posted @ 2018-08-01 10:48  清水00  阅读(178)  评论(0编辑  收藏  举报