# 每日一问——什么是快速排序?如何优化?

简介: 快速排序是从冒泡排序演变而来的算法,但是其比冒泡排序要高效,所以叫做快速排序,简单理解如下。

快速排序是从冒泡排序演变而来的算法,但是其比冒泡排序要高效,所以叫做快速排序,简单理解如下。


我举个简单例子来理解吧:

比如我们即将排序的数组如下:

1  8  9  5  6  3  0

我们一般将首位 1 或者最后一个数字 0 认为是基准元素,然后左右对比,大致规律如下:


0  8 9 5 6 3 —

接下来从左边开始,如果大于等于基准数1,则将移到右边刚才挖空的位置上,如下:

2 — 9 5 6 3 8

接下来继续从右边开始,刚才右边我们进行到3了,继续左移,如果遇到 <= 基准数 0,那么将其移到刚才 挖的 坑上,如果没有遇到,并且左右操作的数相同时,此时 将 基准数 移动到这个空着的坑位。


如下:

0 1 9 5 6 3 8

我们可以发现,基准数1左边的都小于其,右边的都大于其,所以两边各自继续按照刚才上面的逻辑继续递归。(虽然这里最左边只是0,可以忽略)

接下来的过程如下:

0 1 — 5 6 3 8   (基准数9)
0 1 8 5 6 3 —
0 1 8 5 6 3 9  
0 1 — 5 6 3 9 (基准数8)
0 1 3 5 6 9 _
0 1 3 5 6 _ 9
0 1 3 5 6  8 9  (基准数6)

最后,详细的看一下


优化:

  • 快速排序在序列中元素很少时,效率将比较低,不如插入排序,按需使用。
  • 基准数采用随机。
  • 尾递归优化。

快速排序和分治排序算法一样,都有两次递归调用,而且快排的递归在尾部,所以我们可以对快排代码实施尾递归优化。减少堆栈深度。

  • 将每次分割结束后,将于本次基数相等的元素聚集在一起,再次分割时,避免对聚集过的元素进行分割。
  • 多线程优化,基于分治法的思想,将一个规模为 n 的问题分解为 k个规模较小的问题。这些子问题互相独立且与原问题相同。求解这些子问题,然后将子问题的解合并,从而得到原问题的解。
目录
相关文章
|
8月前
17.【快速排序及三分取中优化详解】
17.【快速排序及三分取中优化详解】
36 0
|
2月前
|
搜索推荐 算法 数据处理
从程序设计的角度探索排序算法:冒泡排序的实现与优化
从程序设计的角度探索排序算法:冒泡排序的实现与优化
10 0
|
3月前
|
存储 搜索推荐 算法
拒绝水文!八大排序(四)【适合初学者】归并排序和计数排序
拒绝水文!八大排序(四)【适合初学者】归并排序和计数排序
|
7月前
|
存储 搜索推荐 算法
希尔排序:优化插入排序的精妙算法
排序算法在计算机科学中扮演着重要的角色,其中希尔排序(Shell Sort)是一种经典的排序算法。本文将带您深入了解希尔排序,包括其工作原理、性能分析以及如何使用 Java 进行实现。
224 2
希尔排序:优化插入排序的精妙算法
|
7月前
|
搜索推荐 算法
深入探究排序算法:快速排序的实现与优化
排序算法是计算机科学中的基础知识,它们在各种应用和场景中都扮演着重要角色。本文将深入探讨一种经典的排序算法——快速排序,并介绍其实现原理及优化技巧。
50 1
|
8月前
|
机器学习/深度学习 存储 算法
【数据结构与算法篇】手撕八大排序算法之快排的非递归实现及递归版本优化(三路划分)
【数据结构与算法篇】手撕八大排序算法之快排的非递归实现及递归版本优化(三路划分)
54 0
|
算法 搜索推荐
|
机器学习/深度学习 算法 搜索推荐
算法渣-归并排序
没有一身好内功,招式再多都是空;算法绝对是防身必备,面试时更是不可或缺;跟着算法渣一起从零学算法
108 0
算法渣-归并排序
|
搜索推荐 算法
算法给小码农插入排序洞天,希尔排序轮回
==排序:==所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 ==稳定性:==假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。 ==内部排序:==数据元素全部放在内存中的排序。 ==外部排序:==数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
123 0
算法给小码农插入排序洞天,希尔排序轮回