《iOS面试题整理》- 快速排序

思路

快排利用的是分治的思想, 排序数组中下标 p 到 r 之间的一组数据, 选择 p 到 r 之间的任意一个数据作为 pivot(分区点), 遍历 p 到 r 之间的数据, 将小于 pivot 的放到左边, 大于 pivot 的放到右边, 将 pivot 放到中间。
经过上述操作后, p 到 r 之间的数据被分成了三个部分, p 到 q - 1 之间都是小于 pivot , 中间是 pivot , 后面 q + 1 到 r 之间是大于 pivot的

时间复杂度

快速排序是原地、不稳定的排序算法, O(nlogn)

如果数组中的数据原来已经是有序的了, 例如从小到大排列, 并且选择最后一个元素为分区点, 这样每次分区之后得到的两个区间都是不均等的, 需要进行大量的 n 次分区操作, 这种情况时间复杂度退化为 O(n^2)

实现

 - (void)quickSort:(int *)a start:(int)start size:(int)size {
    [self quickSort:a start:start end:size - 1];
}

- (void)quickSort:(int *)a start:(int)start end:(int)end {
    if (start >= end) return;
    int index = [self partition:a start:start end:end];
    [self quickSort:a start:start end:index -1];
    [self quickSort:a start:index + 1 end:end];
}
- (int)partition:(int *)a start:(int)start end:(int)end {
    if (start >= end) return start;
    int i = start;
    int j = end;
    int pivot = a[start];
    while (i < j) {
        while (i < j && a[j] >= pivot) {
            j--;
        }
        a[i] = a[j];
        
        while (i < j && a[i] <= pivot) {
            i++;
        }
        
        a[j] = a[i];
    }
    
    a[i] = pivot;
    return i;
}

- (void)dump:(int *)a size:(int)size {
    int idx;
    
    for (idx = 0; idx < size; idx++)
        printf("d\n", a[idx]);
}

  // 测试
    int a[6] = {2,5,1,5,4,9};
    QuickSort *sort = [[QuickSort alloc] init];
    [sort quickSort:a start:0 size:6];
    [sort dump:a size:6];

另一种分区方法, 每次都从未处理区间中取一个元素, 如果小于pivot , 则插入已处理区间

  - (int)partition:(int *)a start:(int)start end:(int)end {
    int pivot = a[end];
    int i = start;
    int j = i;
    for (; j <end; j ++) {
        if(a[j] < pivot ) {
            if (i != j) {
                [self swap:a + i b:a +j];
            }
            i++;
        }
    }
    [self swap:a+i b:a+end];
    return i;
}

- (void)swap:(int *)a b:(int *)b{
    int temp = *a;
    *a = *b;
    *b = temp;
}

练习

  1. 无序数组中的第 K 大元素, O(n) 时间复杂度

思路: 最后一个数作为 pivot, 进行分区 , a[0.. p -1], a[p], a[p+1.. n], 如果 p + 1 = K, 则 a[p] 就是目标元素, 如果p + 1 < K, 说明目标元素在 a[p + 1.. n] 中, 如果 p + 1 > k, 说明目标元素在a[0.. p-1]中

- (void)lagerstK {
    int a[] = {6,5,7,8,1,2};
    
    int result = [self findLargest:a left:0 right:5 k:2];
    NSLog(@"%d",result);
}

- (int)findLargest:(int *)a left:(int)left right:(int)right k:(int)k {
    QuickSort *sort = [[QuickSort alloc] init];
    int index = [sort partition:a start:left end:right];  // 分区
    if (index > k - 1) {
        return [self findLargest:a left:left right:index - 1 k:k];
    } else if (index < k - 1) {
        return [self findLargest:a left:index + 1 right:right k:k];
    }
    return a[index];
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • 归并排序和快速排序都用到了分治思想,非常巧妙。我们可以借鉴这个思想,来解决非排序的问题。 归并排序 归并排序的核心...
    被吹落的风阅读 1,329评论 0 3
  • 这个不错分享给大家,从扣上看到的,就转过来了 《电脑专业英语》 file [fail] n. 文件;v. 保存文...
    麦子先生R阅读 6,560评论 5 24
  • 昨天晚上孩子因为吃的不合适难受了,孩子难受的跟我说,妈妈我想吐的不行,我说那你就吐吧,她说可是又吐不出来,我...
    早茶月光C阅读 313评论 2 6
  • 年底将至,至今没剩下多少钱 距离16年结束还有3天,想做的东西还有很多,现在的我无论是能力还是视野还是太低,作为一...
    bu君道阅读 128评论 0 0
  • 刘秀,东汉的开国皇帝,谥号光武皇帝。看他的名字就知道他有多么优秀了。 他出生的时候已经是西汉末年。...
    且笑西风阅读 1,259评论 0 0