美文网首页算法入门
算法入门-数组之快速排序

算法入门-数组之快速排序

作者: zhonglaoban | 来源:发表于2019-03-25 21:39 被阅读0次

快速排序

快速排序是一种分而治之的算法。它选择一个数做为“基准”(pivot),将数组分为两部分,比“基准”数小的放在左边,比“基准”数大的放在的右边,然后分别对左边一部分和右边一部分重复上述操作,直到排序完成。

关键步骤:

1、选取“基准”,可以是第一个数,最后一个数,或者任意一个数。
2、确定“基准”的位置,选取一个变量 j ,遍历数组。选取变量 i ,做为最后一个比“基准”小的坐标位置,那么比“基准”小的个数为(i + 1),“基准”的位置就是(i + 2)。
3、递归的确定左、右两部分的“基准”,直到无法区分左右部分。

代码实现(Objective-c):

//快速排序
- (void)quickSortWithLeft:(int)left right:(int)right array:(NSMutableArray *)mularray{
    NSLog(@"--%@",mularray);
    if (left < right) {
        int pi = [self partition:mularray left:left right:right];
        [self quickSortWithLeft:left right:pi - 1 array:mularray];
        [self quickSortWithLeft:pi + 1 right:right array:mularray];
    }
}
- (int)partition:(NSMutableArray *)mularray left:(int)left right:(int)right {
    //取最后一个做为 pivot
    int pivot = [mularray[right] intValue];
    int i = left - 1;//i 表示“基准”左边的位置
    for (int j = left; j < right; j++) {
        int value = [mularray[j] intValue];
        //如果当前值比“基准”小,i++
        if (value <= pivot) {
            i ++;
            //把当前值放在 i 的右边
            [mularray exchangeObjectAtIndex:i withObjectAtIndex:j];
        }
    }
    //把“基准”放在 i 的右边
    [mularray exchangeObjectAtIndex:i + 1 withObjectAtIndex:right];
    //此时“基准”的下标为 i + 1
    return i + 1;
}

图片解析:

QuickSort.png

步骤解析:

1、i = -1,j = 0;10 < 70,i ++,位置 0 和 0 上的数交换。

此时数组为:10,80,30,90,40,50,70

2、i = 0,j = 1;80 > 70,不做任何操作。
3、i = 0,j = 2;30 < 70,i ++,位置 1 和 2 上的数交换。

此时数组为:10,30,80,90,40,50,70

4、i = 1,j = 3;90 > 70,不做任何操作。
5、i = 1,j = 4;40 < 70,i ++,位置 2 和 4 上的数交换。

此时数组为:10,30,40,90,80,50,70

6、i = 2,j = 5;50 < 70,i ++,位置 3 和 5 上的数交换。

此时数组为:10,30,40,50,80,90,70

7、i = 3,j = 6;此时j 等于数组的最大坐标,for循环终止。将“基准”放在 i + 1 的位置上,返回 i + 1 将数组分为两部分并重复以上步骤。

此时数组为:10,30,40,50,70,90,80

参考资料:
1、GeeksforGeeks
2、维基百科

相关文章

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 排序算法之快速排序

    排序算法之快速排序 参考自算法(第四版),快速排序 算法思想 对数组中取一个切分元素,下文简称pivot 然后使得...

  • 算法入门-数组之快速排序

    快速排序 快速排序是一种分而治之的算法。它选择一个数做为“基准”(pivot),将数组分为两部分,比“基准”数小的...

  • PHP排序算法

    排序算法 冒泡排序(数组排序) 快速排序(数组排序) 参考 http://www.cnblogs.com/enia...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 手撕代码 之 快速排序

    1.实现快速排序算法 问题描述给定一个无序数组int[ ] a,使用快速排序算法进行排序。 解题思路对于快速排序,...

  • 16.8 快速排序之qsort()函数

    对于大型数组,“快速排序”是最有效的排序算法之。它把数组不断分成更小的数组,直到变成单元数组。首先,把数组分成两个...

  • 3.2 快速排序算法

    Chapter3: 更好的查找与排序算法 2. 快速排序算法 1. 什么是快速排序算法 分解数组 A[p..r] ...

  • 算法记录

    快速排序 基本算法: 归并排序讲数组分为两个子数组分别排序,并将有序的子数组归并使得整个数组排序; 快速排序通过一...

  • 快速排序(Java)

    快速排序算法思想: (1)输入的数据信息:输入一个待排序的数组a[n],利用QuickSort算法实现此数组的排序...

网友评论

    本文标题:算法入门-数组之快速排序

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