美文网首页
算法(二)

算法(二)

作者: 一个不太努力的代码搬运工 | 来源:发表于2017-11-08 13:09 被阅读0次

    1.快速排序,它的原理网上都有,我就是举个例子简单的说一下

    {8,4,5,2,4,6} 这样一个无序数组,先从第0个开始取,作为基准标号,让8和其余项作对比,如果比8 小的就放在8的左边,比8大的就放在8的右边,第一次完成之后是这样的4,5,2,4,6,8;然后再次对8左边的部分进行上面的操作,取4作为基准标号,比4大的放在4的左边,比4小的放在4的右边
    上代码的话可能更好理解

    - (void)viewDidLoad {
        [super viewDidLoad];
        NSTimeInterval beginTime = [[NSDate date]timeIntervalSince1970];
        int  arr[9] = {1,2,3,4,6,3,2,4,8};
        [self quickSort:arr left:0 right:8];
        for (int i = 0; i < 9; i ++) {
            NSLog(@"%d",arr[i]);
        }
        NSTimeInterval endTime = [[NSDate date]timeIntervalSince1970];
        NSLog(@"时间差 = %f",endTime - beginTime);
    }
    - (int)getBaseNumWithArray:(int[] )arr left:(int)left right:(int)right {
        //以最左边的数为基准
        int base = arr[left];
        while (left < right) {
            //从基准右端开始遍历,从右向左开始遍历,如果右侧的数大于base,就先不动,继续向左遍历直到找到比base小的数,将它放在最左边
            while (left < right && base <= arr[right]){
                right --;
            }
            //如果小于base,那么将arr[right]放在最左边
            arr[left] = arr[right];
            //从基准左端开始遍历,从左向右开始
            while (left < right && base >= arr[left]) {
                left ++;
            }
                //如果左边的数大于base,那么将arr[left]放在最右边
                arr[right] = arr[left];
        }
       
        return left;
    }
    //进行递归操作
    - (void)quickSort:(int[])arr left:(int)left right:(int)right {
    //注意:这里要判断left<right,不然当left>right,数组中是找不到的
        if (left < right) {
            int base = [self getBaseNumWithArray:arr left:left right:right];
            // 对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序
            [self quickSort:arr left:left right:base - 1];
            // 对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序
            [self quickSort:arr left:base + 1 right:right];
        }
    }
    
    
    1. 冒泡排序 基本思想是:依次比较相邻的两个数,将小数放在前面,大数放在后面。如此重复下去,直至最终完成排序
      代码如下:
    - (void)viewDidLoad {
        [super viewDidLoad];
        int  arr[9] = {1,2,3,4,6,3,2,4,8};
        [self sortArr:arr];
    }
    - (void)sortArr:(int[])arr {
        NSTimeInterval begin = [[NSDate date]timeIntervalSince1970];
        int t;
        for (int i = 0; i < 9; i ++) {
            for (int p = 0; p < 9; p ++) {
                if (arr[p] > arr[p+1]) {
                    t = arr[p];
                    arr[p] = arr[p + 1];
                    arr[p + 1] = t;
                }
            }
        }
        
        for (int a = 0; a < 9; a ++) {
            NSLog(@"%d",arr[a]);
        }
        NSTimeInterval end = [[NSDate date]timeIntervalSince1970];
        NSLog(@"冒泡时间差 = %f",end - begin);
    }
    
    

    比较:都是同样的数组,排序所用时间快速排序时间差 = 0.000691 冒泡时间差 = 0.001359很明显,快速排序所用时间要比冒泡排序所用时间短,但是快速排序是不稳定的,为什么这么说,下面分析一下。

    例如这样一个整数数组:{2,4,3,4,5},在第一次排序后,就把第二个4放在了第一个4的前面,造成两个4调换了位置,非原序这就是“不稳定”,并不是排序之后会造成错乱的不稳定。快速排序是经过验证的,并不会出现排序错误的情况。

    相关文章

      网友评论

          本文标题:算法(二)

          本文链接:https://www.haomeiwen.com/subject/gasemxtx.html