快速排序Python实现及其问题解答

1.基本的快速排序算法

 1 def quick_sort(arry):
 2     return qsort(arry, 0, len(arry)-1)
 3
 4
 5 def qsort(arry, left, right):
 6     if left >= right:
 7         return arry
 8     key = arry[left]
 9     lp = left
10     rp = right
11     while lp < rp:
12         while arry[rp] >= key and lp < rp:
13             rp -= 1
14         while arry[lp] <= key and lp < rp:
15             lp += 1
16         arry[lp], arry[rp] = arry[rp], arry[lp]
17     arry[left], arry[lp] = arry[lp], arry[rp]
18     qsort(arry, left, lp-1)
19     qsort(arry, lp+1, right)
20     return arry

2.快速排序关于先比较右边再比较左边的解释

  首先,需要说明的是,这里的先比较右边再比较左边,是基于将比较基数定为左边left,如果定为右边right,那么就要先比较左边,其他地方没有想过,类似推导吧

  假设先比较左边,我们先来看一个简单的例子,例如 ls = [6, 1, 2, 7, 9],我们的算法中初始情况下 key = 6, left = 0, right = 4, lp = 0, rp = 4

 

1 while lp < rp:
2     while arry[lp] >= key and lp < rp:
3         lp += 1
4     while arry[rp] <= key and lp < rp:
5         lp -= 1
6     arry[lp], arry[rp] = arry[rp], arry[lp]
7 arry[left], arry[lp] = arry[lp], arry[rp]    

  那么在经过第一个while循环以后,lp为3,即 arry[lp]==7, 在进行第二个while循环时,因为要arry[4]>key,而且此时rp == 4, lp ==3,所以执行while循环体,所以rp==3,此时因为lp = rp,所以推出循环,交换arry[left], arry[lp] = arry[lp], arry[rp],所以此时列表变成了[7, 1, 2, 6, 9],显然不满足,小于arry[left](之前的,那个时候为6)的都在左边,大于它的都在右边,所以先比较左边不可行,总的来说,我们总是应该先从基数的对面开始比较。

时间: 2025-01-30 06:12:14

快速排序Python实现及其问题解答的相关文章

快速排序——Python

快速排序: 在一组数据中选择一个基准值,让后将数据分为两个部分,一部分大于基准,一部分小于基准,然后按此方法将两个部分分组,直到不能再分为止. 需要明白一个概念递归和分而治之的概念. Python实现: 1 # 快速排序 2 3 import random 4 5 def quick_sort(arr): 6 # 边界条件 7 if len(arr) < 2: 8 return arr 9 key = random.choice(arr) # 选择基准 10 left = [i for i in

快速排序 python

说到快速排序,真的花了很大的功夫去看,去理解.排序算法是挺复杂的,理解它就好像是剥洋葱一样,一层一层的.好了,下面说说快排的原理吧. 快速排序就像很多网上的文章一样,是分而治之的,通过递归的方式不断的分而治之.每递归一次就找到当前的标杆值将比这个值大的所有数放到标杆值的右边,小的放到左边,然后再分别对标杆值左边和右边的两个子数组进行同样的函数操作. 快排最最核心的地方就是找到每次标杆值所处的位置.有以下几个步骤: 1. 挑选出一个标杆值key,一般选择数组的第一个值 2. 一个for循环,从第二

快速排序(python版)

#!coding:utf8 def quicksort(list_num, left, right): if left > right: return low = left high = right privot= list_num[left] while low<high: while low < high and list_num[high] > privot: high-=1 if low < high: list_num[low] = list_num[high] w

快速排序python实现

#--×--coding:utf-8-*- def main(): nlist = [] while 1: tmp = raw_input("Please input your element,end by -1") if int(tmp ) == -1: break nlist.append(tmp) InsertSort(nlist) def InsertSort(nlist): nlistSize = len(nlist) for index in xrange(nlistSiz

快速排序-Python实现

1). 算法描述: (1)先从数列中取出一个数作为基准数. (2)分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. (3)再对左右区间重复第二步,直到各区间只有一个数. 2)代码: def sub_sort(list1, low, height): key = list1[low] while low < height: while low < height and list1[height] >= key: height -= 1 while low <

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是稳定的排序 堆排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是不稳定的排序 1.快速排序 快速排序的介绍以及C语言实现在这里:快速排序C语言实现 本文介绍的是快速排序python实现: de

排序算法分析【六】:快速排序(附Python&amp;C++代码)

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较. 算法原理 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 步骤为: 从数列中挑出一个元素,称为 "基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的

快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)

冒泡排序的过程是首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字.以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止.上述过程称为第一趟冒泡排序,接着第二趟对前面n-1个关键字进行同样操作,…… 快速排序是对冒泡排序的一种改进,通过一趟排序将记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,可分别对这两部分记录以递归的方法继续进行排序,以达到整个序列有序. 单趟Partition()函数过程请看

JavaScript 、Python Java、Go算法系列之【快速排序】篇

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧.通俗来说就是你们中间谁最小谁就出列,站到队列的最后边,然后继续对着剩余的无序数组说你们中间谁最小谁就出列,站到队列的最后边,一直到最后一个,继续站到最后边,这样数组就有了顺序,从小到大. 1.算法步骤 a.首先在未