快速排序

python 快速排序

此生再无相见时 提交于 2019-12-12 12:51:22
转载自: https://www.jianshu.com/p/2b2f1f79984e 快速排序的介绍 快速排序(quick sort)的采用了 分治 的策略。 分治策略指的是: 将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。 快排的基本思想是: 在序列中找一个划分值,通过一趟排序将 未排序的序列 排序成 独立的两个部分,其中左边部分序列都比划分值小,右边部分的序列比划分值大,此时划分值的位置已确认,然后再对这两个序列按照同样的方法进行排序,从而达到整个序列都有序的目的。 快速排序的Python实现 先来看一个 我更想称之为伪快排的快排代码: def quick_sort(array): if len(array) < 2: return array else: pivot = array[0] less_than_pivot = [x for x in array[1:] if x <= pivot] more_than_pivot = [x for x in array[1:] if x > pivot] return quick_sort(less_than_pivot) + [pivot] + quick_sort(more_than_pivot) 这段代码最关键的是pivot这个参数

快速排序

筅森魡賤 提交于 2019-12-11 17:50:48
快速排序 快速排序是使用分治的思想,先找出基准,以该基准进行二分分治递归 递归首先要找出递归出口,那何处为递归出口呢,questSort方法是递归体,当其left与right相遇则说明整个数组已遍历完成,可以退出循环 双向指针 指的是使用两个不同方向的指针 思路:(保证数组左边的数一直比基准小,数组右边的值一直比基准大) 步骤:1,从右边一直遍历,直到找到比基准小的值,停留在该下标(为什么需要从右边开始? 看代码注释) ​ 2,从右边第2个数字开始遍历,一直到找到比基准大的下标 ​ 3,交互左右指针的下标所存的内容,然后继续上面的方法,一直到左右两个指针相遇 ​ 4,左右两个指针相遇时,将左边的指针的值与基准交换,返回左边的指针的下标,这个为基准值 常规做法是使用双向指针去完成,但是注意需要先从右开始遍历,再从做遍历, public static void questSort ( int [ ] a , int left , int right ) { //递归结束条件 if ( left >= right ) { return ; } //找到基准 int patten = patten ( a , left , right ) ; //左边排序 questSort ( a , left , patten - 1 ) ; //有有右边排序 questSort ( a ,

排序算法系列——快速排序

旧街凉风 提交于 2019-12-11 14:00:51
什么是快速排序? 快速排序 ,顾名思义它排序的速度十分的快。 它快到什么程度呢? C语言标准库中的 qsort 函数就是使用快速排序实现的! 说到快速排序,离不开两个重要的概念: 递归 和 分治算法(Divide ans conquer, D&C) 。 如果要讲清楚这两个概念,可以单独写两篇文章出来了。 因此这里不做深入,只简单介绍一下: 递归 :重复调用自己的函数。一般由两个部分组成 基线条件 和 递归条件 ,程序在符合 基线条件 的时候返回,在符合 递归条件 的时候调用自己。 分治算法(Divide ans conquer, D&C) : 将大的问题化解为相同类型的小问题。一种著名的递归式问题解决办法,一般分为两个步骤,首先找出尽可能简单的 基线条件 ,然后将 递归 的将问题分解为小问题,直到小问题符合 基线条件 。 假如还不太明白这两个概念,没关系,看下面的例子就可以了。 排序过程 既然 快速排序 的核心思想是 D&C ,那么它的 基线条件 和 递归 条件分别是什么呢? 首先我们思考一下, 什么样的数组需要排序 ? 长度为 0 的数组需要排序吗? 不需要。因为它的没有顺序的概念。 长度为 1 的数组需要排序吗? 不需要。因为可以把它看做一个有序数组了。 长度为 2 的数组需要排序吗? 需要。因为并不能确定它的顺序。 因此,我们可以把 长度为0或1的数组 设为是 基线条件 。

常见排序算法——快速排序

耗尽温柔 提交于 2019-12-10 21:12:09
快速排序: 它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小, 然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时 间复杂度为O(n 2 ),最好情况时间复杂度为O(nlog 2 n)。 图解: 我已经将代码的关键步骤都大了注释,希望可以帮助理解。 //瞎打快排 package sdx; import java.util.Arrays; public class Main6 { public static void quickSort(int[] arr,int left,int right){ int i,j,JiShu; if(left>right){ return;//当左边大于右边时,方法不合法,所以return结束这个方法 } //定义哨兵 i=left; j=right; //JiShu就是基准位 JiShu = arr[left]; //当i和j不相遇时,再循环中进行检索。 while (i!=j) { //先看右边,依次往左递减S while (JiShu<=arr[j]&&i<j) {//i<j是为了是为了不让在i和j相遇时错过。 j--;//哨兵j向左继续移动。 } //再看左边,依次往右递增 while (JiShu>=arr[i]

【Python】冒泡排序和快速排序

坚强是说给别人听的谎言 提交于 2019-12-10 18:20:25
虽然说Python里面提供了现成的排序方式,而且效率也非常高,但是该会的还是得会。这里我也就不多说什么了,代码+注释,自己看吧! 在这里为了B站视频测试二者效率,所以增加了随机数和时间的计算。 from time import time from random import randint # 全局变量,便于修改 gl_length = 100 # 定义空列表,存放排序数据 num_list = [ ] # 产生随机数函数 def listRandom ( num_list ) : i = 0 while i < gl_length : # 随机范围0~999 num_list . append ( randint ( 0 , 1000 ) ) i += 1 # 遍历函数 def listForeach ( num_list ) : print ( "=" * 80 ) # 为了换行的美观,没有直接使用 for i in num_list for i in range ( gl_length ) : print ( num_list [ i ] , end = "\t" ) if ( ( i + 1 ) % 10 ) == 0 : print ( "\n" ) # 冒泡排序 def bubbleSort ( num_list ) : star_time = time ( ) for

golang数据结构之快速排序

你离开我真会死。 提交于 2019-12-10 16:42:45
具体过程:黑色标记代表左指针,红色标记代表右指针,蓝色标记代表中间值。(依次从左往向下) //QuickSort 快速排序 func QuickSort(left int, right int, arr *[7]int) { l := left r := right pivot := arr[(left+right)/2] tmp := 0 for l < r { for arr[l] < pivot { l++ } for arr[r] > pivot { r-- } if l >= r { break } tmp = arr[l] arr[l] = arr[r] arr[r] = tmp if arr[l] == pivot { r-- } if arr[r] == pivot { l++ } } if l == r { l++ r-- } if left < r { QuickSort(left, r, arr) } if right > l { QuickSort(l, right, arr) } } 来源: https://www.cnblogs.com/xiximayou/p/12017445.html

快速排序相关(学习笔记)

做~自己de王妃 提交于 2019-12-09 18:54:52
1)快排的原理是什么?快速写一段核心代码实现。 A.快速排序的原理解释 首先,在符合递归条件下进行 其次,得到基准元素位置 ①从数列中取出第一个数作为基准元素 ②实现元素的移动(比基准元素大的放右边,小于或等于放左边) 方法一:挖坑填数,选定基准元素Pivot,并记住位置index(坑位),并且设置两个指针right和left,在上面的分区过程中,符合条件能够左右置换的,被比较的数将坑位填满,自己成为下一个坑位,继续比较下去,直到right和left重合在了同一位置,再将Pivot元素放置到index,并得到基准元素位置。 方法二:指针交换法,控制指针、进行比较、判断是否需要移动、交换指针指向的元素,right和left重合,Pivot元素替换,得到基准元素位置。 最后,再对左右区间进行递归。 B.快速写一段核心代码实现: public static void quickSort(int[] arr, int right, int left) { if (right >= left || arr == null || arr.length <= 1) { return; } int i = right, j = end, pivot = arr[(right + left) / 2]; while (i <= j) { while (arr[i] < pivot) { ++i; }

排序算法-快速排序(Java)

人盡茶涼 提交于 2019-12-09 15:19:42
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className QuickSort * @date 2019/12/9 14:13 * @package com.rao.sort * @Description */ public class QuickSort { /** * 把数组从中间分开,左边的数都小于pivot,右边的数都大于pivot * @param arr:要拆分的数组 * @param left:从left开始计算 * @param right:到right截至 * @return 返回中间值的下标 */ public static int partition(int[] arr, int left, int right){ //把数组中的第一个数当作pivot int pivot = arr[left]; //左指针指向pivot右边的第一个数 int i = left+1; //指向数组末尾最后一个数 int j = right; while (true){ //从左边开始,找到第一个比pivot大的数 while (i <= j && arr[i] <= pivot){ i++; } //从右边开始,找到第一个比pivot小的数 while (i <= j &&

算法4 2.3 快速排序

笑着哭i 提交于 2019-12-09 14:33:00
快速排序 快速排序引人注目的 优点 包括它是原地排序(只需要一个很小的辅助栈),且将长度为N 的数组排序所需的时间和NlgN 成正比。另外,快速排序的内循环比大多数排序算法都要短小,这意味着它无论是在理论上还是在实际中都要更快。 它的主要 缺点 是非常脆弱,在实现时要非常小心才能避免低劣的性能。 快速排序是一种 分治 的排序算法。它将一个数组**切分(partition)**成两个子数组,前一个数组所有元素均不大于后一个数组的任意元素。将两部分独立地排序。当两个子数组都有序时整个数组也就自然有序了。 快速排序的实现过程如算法2.5 所示。 // 算法2.5 public class Quick { public static void sort ( Comparable [ ] a ) { StdRandom . shuffle ( a ) ; // 这是算法4配套的函数包里的一个方法, // 将数组a随机排序 // 消除对输入的依赖 sort ( a , 0 , a . length - 1 ) ; } private static void sort ( Comparable [ ] a , int lo , int hi ) { if ( hi <= lo ) { return ; } int j = partition ( a , lo , hi ) ; // 切分(请见

数据结构--排序算法总结

拥有回忆 提交于 2019-12-07 22:04:26
原创不易,尊重原创,本文转载于 Nim的辙迹 的博文,博文地址:http://blog.csdn.net/codernim/article/details/54312616 概述 排序的分类:内部排序和外部排序 内部排序:数据记录在内存中进行排序 外部排序:因排序的数据量大,需要内存和外存结合使用进行排序 这里总结的八大排序是属于内部排序: 当n比较大的时候, 应采用时间复杂度为( nlog 2 n )的排序 算法 :快速排序、堆排序或归并排序。 其中,快速排序是目前基于比较的内部排序中被认为最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。 ——————————————————————————————————————————————————————————————————————— 插入排序——直接插入排序( Straight Insertion Sort ) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。 即:先将序列的第1个记录看成一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。 要点:设立哨兵,用于临时存储和判断数组边界 直接插入排序示例: 插入排序是稳定的 ,因为如果一个带插入的元素和已插入元素相等,那么待插入元素将放在相等元素的后边,所以,相等元素的前后顺序没有改变。 算法实现: [cpp]