iOS 算法总结

iOS - 快速排序

2017-12-25  本文已影响72人  SkyMing一C

Demo_github

图片源于网络

快速排序

快速排序(Quick Sort)是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

算法思想

图-快速排序示例图

上图中,演示了快速排序的处理过程:

范例代码

#pragma mark --- 快速排序
/**
 快速排序
 
 @param array 需要排序的Array
 @param left 初始索引
 @param right 最后一位索引
 */
+ (void)quickSort:(NSMutableArray *)array left:(int)left right:(int)right
{
    
    if(array == nil || array.count == 0 || left >= right){
        NSLog(@"注意快速排序条件");
        return;
    }
    
    // 以最左边的数(left)为基准
    int base = left;
    NSNumber *prmt = array[base];
    //    //取中值
    //    int middle = left + (right - left)/2;
    //    NSNumber *prmt = array[middle];
    int i = left;
    int j = right;
    
    /**
     while是循环流程控制,使用的标准格式为
     while(表达式)
     {
     循环语句体;
     }
     说明:①while循环的表达式是循环进行的条件,用作循环条件的表达式中一般至少包括一个能够改变表达式的变量,这个变量称为循环变量
     ②当表达式的值为真(非零)时,执行循环体;为假(0)时,则循环结束
     ③当循环体不需要实现任何功能时,可以用空语句作为循环体
     ④对于循环变量的初始化应在while语句之前进行,可以通过适当方式给循环变量赋初值
     */
    //开始排序,使得left<prmt 同时right>prmt
    while (i < j) {
        //        while ([array[j] intValue] > [prmt intValue]) {
        //该行与下一行作用相同
        // j 从右至左移动(j--) 直到找到一个小于[prmt intValue]的数停下来
        while ([array[j] compare:prmt] == NSOrderedDescending) {
            j--;
        }
        //        while ([array[i] intValue] < [prmt intValue]) {
        //该行与下一行作用相同
        /**
         i 从左至右移动(i++) 直到找到一个大于[prmt intValue]的数停下来
         */
        while ([array[i] compare:prmt] == NSOrderedAscending) {
            i++;
        }
        
        //如果i与j未相遇 交换其数据
        if(i < j){
            [array exchangeObjectAtIndex:i withObjectAtIndex:j];
            //i 与j 各移动一位 进入下一循环
            i++;
            j--;
        }
        NSLog(@"快速排序排序中:%@",array);
    }
    
    //第一轮排序完成 将数组拆成 A[p ..q-1] <= A[q] <= A[q+1 ..r] 模式的两个数组 递归
    /**
     程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。递归有直接递归和间接递归
     •直接递归:函数在执行过程中调用本身。
     •间接递归:函数在执行过程中调用其它函数再经过这些函数调用本身。
     •递归算法有四个特性:
     (1)必须有可最终达到的终止条件,否则程序将陷入无穷循环;
     (2)子问题在规模上比原问题小,或更接近终止条件;
     (3)子问题可通过再次递归调用求解或因满足终止条件而直接求解;
     (4)子问题的解应能组合为整个问题的解。
     */
    
    // 对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序
    if (left < j) {
        [self quickSort:array left:left right:j];
    }
    // 对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
    if (right > i) {
        [self quickSort:array left:i right:right];
    }
}

算法分析

快速排序的算法性能

参考

排序二 快速排序

坐在马桶上看算法:快速排序

图解快速排序

排序算法之 快速排序 及其时间复杂度和空间复杂度

上一篇 下一篇

猜你喜欢

热点阅读