美文网首页算法
排序-快速排序(交换排序类型-分治法-递归)

排序-快速排序(交换排序类型-分治法-递归)

作者: iOS大蝠 | 来源:发表于2019-12-11 14:20 被阅读0次

快速排序

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

算法步骤:

  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

时间复杂度和空间复杂度

时间复杂度:
(1)最好: O(nlogn)
(2)最坏:O(n2)
(3)平均: O(nlogn)

空间复杂度:
O(nlogn)

参考代码

C语言

#include <stdio.h>

int getPivot(int a[],int left, int right){
    int i = left,j = right,X = a[i];
    while (i<j) {
        //先从右往左找,当大于基准数的时候,一直往左找
        while (i<j && a[j] >= X) {
            j--;
        }
        if (i<j) {
            a[i] = a[j];
            i++;
        }
        //从左往右找,当小于基准数的时候,一直往右找
        while (i<j && a[i] < X) {
            i++;
        }
        if (i<j) {
            a[j] = a[i];
            j--;
        }
    }
    
    //将基准数插入当前下标
    a[i] = X;
    
    return i;
}

void quiteSort(int a[],int left,int right){
    if (left<right) {
        int pivot = getPivot(a, left, right);
        quiteSort(a, left, pivot-1);
        quiteSort(a, pivot+1, right);
    }
}

int main(int argc, const char * argv[]) {
    
    int a[] = {7,3,5,6,8,1,9,2,4};
    
    quiteSort(a, 0, 8);
    
    for (int i = 0 ; i<9; i++) {
        printf("%d ",a[i]);
    }
    return 0;
}

相关文章

  • 排序-快速排序(交换排序类型-分治法-递归)

    快速排序 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。...

  • 算法-快速排序算法

    青峰科技19小时前快速排序算法是分治算法技术的一个实例,也称为分区交换排序。快速排序采用递归调用对元素进行排序,是...

  • 《算法图解》NOTE 4 快速排序法

    这是《算法图解》的第四篇读书笔记,主要涉及快速排序法。 1.递归与分治法 快速排序法(quick sort)之所以...

  • java实现快速排序&最长子字符串

    快速排序 简述 快速排序是一种排序执行效率很高的排序算法,它利用分治法来对待排序序列进行分治排序,它的思想主要是通...

  • [算法导论]归并排序

    时间复杂度 《算法导论》2.3.1 分治法。 归并排序采用了分治法的递归排序。分治法:分解子问题,解决子问题,合并...

  • 不积跬步之快速排序

    快速排序使用了分治思想来实现。 和冒泡排序一样,快速排序也属于交换排序,通过元素直接的比较和交换位置来达到排序的目...

  • 06-快速排序(完成)

    快速排序(高效排序算法) —— 不稳点!!! 动态图: 一、概念: 原理:  快速排序使用分治法(Divide a...

  • 快速排序

    概述 快速排序基于分治法 稳定性 快速排序在分割的过程中会交换不相邻元素,因此属于不稳定的排序算法。 时间复杂度 ...

  • 多语言实现快速排序算法

    快速排序: 快速排序采用“分而治之、各个击破”的观念,此为原地(In-place)分割版本。 快速排序使用分治法(...

  • 排序算法篇_快速排序法

      快速排序(Quick Sort)法和冒泡排序法类似,都是基于交换排序思想的。快速排序对冒泡排序法进行了改进,从...

网友评论

    本文标题:排序-快速排序(交换排序类型-分治法-递归)

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