文章目录

  • 1.基本思想
  • 2.算法原理
  • 3.分区—partition
    • 1.挖坑法
    • 2.指针交换法
  • 4.怎么选取基准
  • 5.时间复杂度
  • 6.LeetCode

1.基本思想

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

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换。
冒泡排序算法的运作如下:
1.比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2.算法原理

  快速排序算法运作如下:

  1. 从数列中挑出一个元素,称为基准(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。分区操作结束之后,基准元素就处于最终排序后它的位置。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序,直至所有子数列只剩下一个元素为止

3.分区—partition

  以下两种方法掌握其一就行

1.挖坑法

在开始的时候4,1下面都有指针,分别对应的l、r指针,第一个坑为4,由于r指针指向的1小于4,所以1移到l指针指向的坑,此时原1出处为坑,l指针向右移动一位,指向7,由于l指针指向的7大于4,所以7移动到l指针指向的坑,此时原7处为坑,重复该操作直到l指针与r指针相重合,此时该处就为4.
以上就完成了分区操作,
接下来再递归地把小于基准值元素的子数列和大于基准值元素的子数列排序,直至所有子数列只剩下一个元素为止

2.指针交换法

  核心思想就是找到两边不满足条件的指针然后交换指针。

基准为4,l指针指向7,r指针指向1,由于1<4<7,不满足条件,所以两个指针交换,r指针移动一位,1<4<8,满足条件,r指针移动一位,1<4<2右边不满足条件,需移动左边,l指针移动一位,6<4<2,两边均不满足条件,两个指针交换,r指针移动一位,2<4<3,右边不满足条件,l指针移动一位,5<4<3,两个指针交换,r指针向左移动一位,此时双指针重合并指向3,3与4对调。
以上便是指针交换法。

4.怎么选取基准

  1. 选取第一个元素作为基准
  2. 随机选择一个元素作为基准

5.时间复杂度

  快速排序的平均时间复杂度是O(nlogn),最坏情况下的时间复杂度是O(n^2)。

选取第一个元素作为基准时,n个元素,每个元素遍历一次,此时,时间复杂度为O(n^2)

6.LeetCode

  215.在未排序的数组中找到第k个最大的元素(需要找的是数组排序后第k个最大的元素)

输入:[3,2,1,5,6,4]和k
输出:5

class Solution:def findKthElement(self, nums, k):'''找到数组中第k个最大元素,快速排序每一轮确定一个位置,如果我们想要的位置的元素确定了,那么排序就结束了:param nums: 数组:param k: k:return: 返回第k个最大元素'''return self.quickSort(nums, k)def quickSort(self, nums, k):# 找到我们要寻找元素的位置k = len(nums) - k# 左右指针的位置left, right = 0, len(nums) - 1  # 0,4while left < right:# 进行分区操作,得到确定的位置,将确定的位置与k进行比较后,对子数据集进行分区操作j = self.partition(nums, left, right)if j == k:breakelif j < k:left = j + 1else:right = j - 1# 跳出循环有两个条件:一种是j=k,一种是left=right,两种情况下均可满足j=kreturn nums[k]def partition(self, nums, left, right):'''分区操作—挖坑法,确定某个元素的位置:param nums: 数组:param left: 左指针:param right: 右指针:return: 返回确定元素的位置'''pivot = nums[left]# quickSort函数中也有left、right函数i, j = left, right# 跳出循环的条件是:i = j,此时,即为元素的位置while i < j:# 跳出条件是找到小于基准的元素nums[j]或i=jwhile i < j and nums[j] > pivot:j -= 1if i < j:nums[i] = nums[j]i += 1# 找到大于基准的元素nums[i]while i < j and nums[i] <= pivot:i += 1if i < j:nums[j] = nums[i]j -= 1# i = j时nums[i] = pivotreturn idef main():nums = [3, 2, 1, 5, 6, 4]k = 2s = Solution()kth_element = s.findKthElement(nums, k)print('数组中第%d个最大元素为%d' % (k, kth_element))if __name__ == '__main__':main()

代码已上传至https://github.com/Libra-1023/leetcode

LeetCode—1.快速排序算法相关推荐

  1. 【一起来刷题】基础排序问题之快速排序算法

    本章收录于专栏:一起来刷题,持续更新中-- 更多精彩文章,欢迎大家关注我,一起学习,一起进步~ 本章来谈一谈快速排序算法.快排算法是一种很重要的算法,也经常会在面试中遇到.快排的时间复杂度为O(Nlo ...

  2. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  3. 技术图文:如何在leetcode上进行算法刻意练习?

    背景 众所周知,通过刻意练习高质量的题目可以加深我们对计算机科学中经典数据结构的深刻理解,从而可以快速用合适的数据结构去解决现实中的问题.而LeetCode就是一个收集了各大IT公司的笔试面试题的在线 ...

  4. 快速排序算法实现思想个人理解

    一.概述 快速排序是冒泡排序的改进算法.它也是通过不断比较和移动交换来实现排序的,只不过它的实现增大了记录的比较和移动的距离,将关键字较大的元素从前面直接放到后面,关键字较小的元素直接从后面放到前面, ...

  5. 快速排序算法(基于Java实现)

    title: 快速排序算法(基于Java实现) tags: 快速排序算法 快速排序算法的原理与代码实现: 一.快速排序算法的原理 快排算法的思想是: 如果需要排序数组中下标从p到r之间的一组数据,我们 ...

  6. java sort算法名称_快速排序算法(Quick Sort)(java)

    /** * 快速排序算法是基于分治策略的一种排序算法,下面是一个递归的快速排序. * @author liuy */ public class QuickSort { public static vo ...

  7. 【算法】快速排序算法的编码和优化

    参考资料 <算法(第4版)>          - - Robert Sedgewick, Kevin Wayne <啊哈! 算法>              - - 啊哈磊 ...

  8. Quick Sort 快速排序算法

    Table of Contents 前言 算法步骤 选取枢纽元 分割数组 算法实现 小数组和插入排序 结语 前言 快速排序算法应该是常见的排序算法中使用的最多的一个,很多语言内置的排序算法都间接或直接 ...

  9. leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现

    leetcode explore 初级算法第三题,旋转数组代码实现.原题链接: 题目分析 因为题目不是很长,这里把题目贴出来: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...

  10. 排序算法系列:快速排序算法

    概述 在前面说到了两个关于交换排序的算法:冒泡排序与奇偶排序. 本文就来说说交换排序的最后一拍:快速排序算法.之所以说它是快速的原因,不是因为它比其他的排序算法都要快.而是从实践中证明了快速排序在平均 ...

最新文章

  1. php获取表字段,使用 php 获取表的字段信息
  2. 数据流图和数据字典 (笔记 )
  3. ABC Perl Programing - 回 2gua 短消息
  4. 语音识别2:CTC对齐的算法
  5. Python 实现杨辉三角
  6. 三地警察抓兔子[转]
  7. PoolTogether本周Loot Box奖金组合中新增加入ESSAY代币
  8. 设某一机器由n个部件组成_组成原理
  9. Hash冲突的解决方式
  10. 什么工作经常出差_职场妈妈困扰: 经常出差, 工作孩子该怎么选择?
  11. 程序员的十个经典算法
  12. 黑色星期五c语言程序,黑色星期五C语言实现
  13. 碳带与标签匹配规则及效果测试
  14. 提升计算机科学素养,中职学生计算机科学与技术专业素养提升策略
  15. jni调用出现SIGABRT崩溃
  16. 4、基于XML的AOP配置
  17. laravel图形验证码(借用了TP的图形验证码类)非常好用简单,非常适合前后端分离的项目
  18. 深入浅出零知识证明(二):zkSNARKs基本原理
  19. 到底什么才是边缘计算?
  20. 2019.01.17【BZOJ4399】 魔法少女LJJ(FHQ_treap)(ODT)

热门文章

  1. JAVA – 虚函数、抽象函数、抽象类、接口_对比C++
  2. SQL安装过程中安装程序挂起问题解决
  3. java day04【 Idea、方法】
  4. leetcode 153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array)
  5. luogu P2678 跳石头 二分answer
  6. 如何断开所有SQL Server所有的连接
  7. mysql的数据类型5---enum与set类型
  8. HDU 6599 I Love Palindrome String (回文树+hash)
  9. c#截取两个指定字符串中间的字符串
  10. Centos7搭建虚拟用户FTP