基础算法之快速排序算法

快速排序基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

比如序列[6,8,1,4,3,9],选取6为基准数key(不会变的),然后从右往左遍历过去,发现第一个比key小的数3,就把6和3交换位置,序列就变成了[3,8,1,4,6,9]

然后从左往右遍历过去,发现第一个比key大的值8,把8和6交换位置,序列变成[3,6,1,4,8,9]

以上称为一次小循环

然后再来一次循环,序列变成了[3,4,1,6,8,9],发现6的左边都是比6小的数,右边都是比6大的数,此时无法再遍历了,于是退出这个大循环

接下去,需要对key值左边的序列和右边的序列分别重复以上操作,也就是[3,4,1]和[8,9],只要用递归就行了。

代码如下:

 1 def quick_sort(array,left,right):
 2     if left >= right:
 3         return
 4
 5     low = left#序列第一个索引
 6     high= right#序列最后一个索引
 7     key = array[low]#基准书数
 8
 9     while low < high:#在左右未相遇的情况下
10         while low < high and array[high] > key:#找到右侧比key小的那个值
11             high -= 1
12         array[low] = array[high]
13         array[high] = key
14
15         while low < high and array[low] <= key:#找到右侧比key大的值
16             low += 1
17         array[high] = array[low]
18         array[low] = key
19
20     quick_sort(array,left,low-1)#对key左边的序列进行递归
21     quick_sort(array,low+1,right)#对key右边的序列进行递归
22 array = [8,4,2,3,5,34,1,40] quick_sort(array,0,len(array)-1) print(array) # [1, 2, 3, 4, 5, 8, 34, 40]

需要注意的地方是,10和15行需要加上等于号,可以两个或者任意一个,不然遇上序列中有多个相同的值会进入死循环

直接插入排序复杂度:

时间复杂度: 最好情况O(nlogn), 最坏情况O(n^2), 平均情况O(nlogn)

下面空间复杂度是看别人博客的,我也不大懂了……改天再研究下。

最优的情况下空间复杂度为:O(logn);每一次都平分数组的情况

最差的情况下空间复杂度为:O( n );退化为冒泡排序的情况

稳定性:不稳定

原文地址:https://www.cnblogs.com/yqpy/p/8650488.html

时间: 2024-11-05 14:55:22

基础算法之快速排序算法的相关文章

c#冒泡排序算法和快速排序算法

依次比较相邻的两个数,将小数放在前面,大数放在后面. 第1趟: 首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.至此第一趟结束,将最大的数放到了最后. 第2趟: 仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中

iOS算法(一)快速排序算法

快速排序是当遇到较大数据时,排序快,高效的方法(公司面试时,基本上会被问到...) 该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. 简单地理解就是,找一个基准数(待排序的任意数,一般都是选定首元素),把比小于等于基准数的元素放到基准数的左边,把大于基准数的元素放在基准数的右边.排完之后,在把基准数的左边和右边各看成一个整体,  左边:继续选择基准数把小于

[算法研究]の快速排序算法--javascript实现

快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 时间复杂度最坏的情况下是O(nlogn) .也是相似复杂度下较常用的一种排序 var s = [72 ,6, 57, 88, 60, 42, 83 ,73, 48,57,

希尔排序算法和快速排序算法

希尔排序源代码如下: #include <stdio.h> //希尔排序 void shellSort(int a[],int l, int r){ //一次排序同一步长所组成的集合 如a[0],a[5],a[10]... int i,j,h; for(h=1;h<=(r-1)/9;h=3*h+1); //设置步长为1,4,13,40,121,...序列 for( ; h>0;h/=3) for(i=h;i<=r;i++){ int j = i;int v = a[i]; w

【经典算法】快速排序算法

原文地址:http://blog.csdn.net/morewindows/article/details/6684558 作者:MoreWindows 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影.总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序

排序算法之 Java简单快速排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class SimpleQuick { public int[] sort(int[] arr,int left,int right){ if ( arr == null || a

java:快速排序算法与冒泡排序算法

 Java:快速排序算法与冒泡算法 首先看下,冒泡排序算法与快速排序算法的效率: 如下的是main方法: public static void main(String[] args) { //快速排序算法测试 int[] qArray = new int[100000]; for (int i = 0; i < 100000; i++){ qArray[i] = (int) (Math.random() * 100000); } long beforeQ = System.currentTi

十大基础实用算法之快速排序和堆排序

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "基准"(pi

java基础算法之快速排序

快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.fighting 算法概念 快速排序由C. A. R. Hoare在1962(50多年了呢)年提出,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有