随机化快排(1)

2023-11-11 06:58
文章标签 随机化 快排

本文主要是介绍随机化快排(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

快速排序是一个经常使用的排序算法,其名字直接显示了它的优势—快速。

 

然而,快速排序的最坏情况效率和插入排序冒泡排序等低级排序一样慢。

 

尴尬,一个叫做快速排序的排序速度竟然会和最垃圾的排序速度差不多。

 

然而,快速排序的应用还是非常广的。

 

随机化快速排序就是一种方法使得快速排序能够快速运行的一种机制。

 

快速排序的讲解

(1)    快速排序的基本思想

(2)    一个C语言实现

(3)    讨论速度慢的原因以及对快排的性质进行简单了解

(4)    随机化算法

(5)    随机化快速排序

 

快速排序的基本思想:

因为快速排序是一种递归算法,所以描述起来是很轻松的。

基本思路如下:从待排序列中选出一个元素作为枢纽元x,将剩余序列分为两部分,一部分为小于枢纽元的A,另一部分为大于枢纽元的B。然后对序列A和序列B分别使用快速排序。

 

图示如下

 

原始序列包含七个元素,分别为28,12,47,84,4,47,88,63

现在我们选取第一个元素作为枢纽元也就是28,得到两个子序列A,B

A 12 4

B 47 84 47 88 63

A中元素都是小于枢纽元28的数,而B中都是大于28的数。


最后,我们对A序列和B序列重复上述的工作也就完成了快速排序了。

 

可以说快速排序是那么多排序当时思路最简洁的一个算法了。前几次的推文中讲了很多关于递归方面的东西,因为快速排序是一个递归算法,下面从递归的角度简单描述此算法。

 

快速排序是符合典型的分治法(divide and conquer)的

 

分:

       为了能够解决排序问题,快速排序先取出一个枢纽元。

       以此枢纽元作为标准,划分出两个序列A,B,一组小于它,一组大于它。

解决:

       对序列A,B递归快速排序

合并:

       无

 

快速排序随是一个典型的递归算法。不过它有一个很独特的地方,所有的处理都集中在了分解前的比较过程中(就是分出A和B),所以最后的合并没有任何操作。

 

接下来,我们看一下快速排序的递归底层。

 

之前说过,没有递归底层一个递归过程是会走向无穷递归的,因此即使没有合并算法,快排一定有递归底层。

 

快排的递归底层即是序列只有一个元素或者没有元素。举个栗子,分解出来的A和B子序列中,A序列只有一个元素,那么递归A的时候就应该直接返回,这样也就是一个递归底层了。没有元素的栗子在下次再举吧,因为这个具体的实现有关系。

这篇关于随机化快排(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388315

相关文章

快排Java

快速排序的复杂度 快排代码 package leetcode;import java.util.Arrays;public class QuickSort {public static void quickSort(int[] array, int low, int high) {if (low < high) {int pivotIndex = partition(array, low,

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

冒泡排序;选择排序;插入排序;快排;判断大小端;位运算

1.冒泡排序:基础        时间复杂度来说:o(n^2) 从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 #include <stdio.h>int main(void){int str[32] = 0;int i = 0;int j = 0;int len = sizeof(str) / sizeof(str[0]);

【算法-快排】

定义 快速排序(Quick Sort)是一种基于分治思想的高效排序算法。它通过选择一个“基准”元素(pivot),将数组划分为两部分:一部分比基准小,另一部分比基准大,然后递归地对这两部分进行排序。 步骤 选择基准(Pivot Selection):从数组中选择一个元素作为基准。通常选择第一个元素、最后一个元素、或中间元素。分区(Partitioning):将数组划分为两个部分,使得左边部分

#1128 : 二分·二分查找 ( 两种方法 先排序在二分O(nlogN) + 直接二分+快排思想O(2N) )

#1128 : 二分·二分查找 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩《艦これ》,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位)。去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船。每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀

快排对二维字符排序

今天出来实习的第四天实在无聊,就偷偷写着玩 给一个字符二维数组让你按字典序进行排序 #include<cstdio>#include<iostream>#include<algorithm>#include<stdlib.h>#include<time.h>#include<string.h>using namespace std;bool compare(char *p1,

堆排序 快排

堆排序关系parent = (i-1) / 2left = 2i + 1right = 2i+2 public class HeapSort {public static void main(String []args){int tree [] = {10,3,4,9,11};int n = 5;heapSort(tree,n);for (int i : tree){System.ou

introsort的快排跑排序OJ代码

introsort的快排跑排序OJ代码 introsort是introspective sort采⽤了缩写,他的名字其实表达了他的实现思路,他的思路就是进⾏⾃ 我侦测和反省,快排递归深度太深(sgi stl中使⽤的是深度为2倍排序元素数量的对数值)那就说明在这种数据序列下,选key出现了问题,性能在快速退化,那么就不要再进⾏快排分割递归了,改换为堆 排序进⾏排序。 void Swap(in

普通快排与随机快排的世纪大战

以下文章来源于微信公众号“老肥码码码” ,作者斐波那契小李   点击上方“算法与数据之美”,选择“置顶公众号” 更多精彩等你来! 算法一直是计算机学科中一个非常核心的内容,学习大黑书可以让我们年轻人得到充沛的力量(也就是少点头发),在程序的海洋里快乐徜徉。 排序算法是算法之中一个既基础又核心的内容,而快速排序则是比较排序中的佼佼者。今天我们就一起来探究一下快速排序。 普通快速排序 快速

快排之三路划分

决定快排性能的关键点是每次单趟排序后,key对数组的分割,如果每次选key基本⼆分居中,那么快排的递归树就是颗均匀的满⼆叉树,性能最佳。但是实践中虽然不可能每次都是⼆分居中,但是性能也还是可控的。但是如果出现每次选到最⼩值/最⼤值,划分为0个和N-1的⼦问题时,时间复杂度为O(N^2),数组序列有序时就会出现这样的问题,我们前⾯已经⽤三数取中或者随机选key解决了这个问题,也就是说我们解决了绝⼤