python数据结构学习笔记-2016-11-24-01-快速排序
来源:互联网 发布:c语言编程简单的小游戏 编辑:程序博客网 时间:2024/04/29 18:39
12.2 快速排序
快速排序(quick sort)仍旧是采用分治法,该排序算法按照选定的主键(pivot key)将序列分成两部分。此外,该算法不需要使用临时数组。
12.2.1 算法描述
首先是选定第一个元素作为主键,将序列分成两部分,分别为L和G,L是小于主键的部分,G是大于主键的部分。其次,对L和G分别重复上述过程,一直到不能再分为止。最后,同归并算法一样,将分出来的子组排序后重新组合,返回原序列的排序序列。
12.2.2 实现
快速排序实现的代码如下:
#-*-coding: utf-8-*-# 实现快速排序# 包装函数def quickSort(theSeq): n = len(theSeq) recQuickSort(theSeq, 0, n-1)def recQuickSort(theSeq, first, last): if first >= last: return else: pivot = theSeq[first] # 选定主键 pos = partitionSeq(theSeq, first, last) # 分割序列 # 进入递归部分 recQuickSort(theSeq, first, pos-1) # 对小于主键的部分进行操作 recQuickSort(theSeq, pos+1, last) # 对大于等于主键的部分进行操作# 操作序列的分割,主要是操作left和right两个标记,将小于主键的元素移至左侧,将大于主键的元素移至右侧def partitionSeq(theSeq, first, last): pivot = theSeq[first] # 选定主键 left = first + 1 # left从第二个元素开始 right = last # right从最后一个元素开始 while left <= right: # 保持left小于right while left < right and theSeq[left] < pivot: # 确保left指向的元素小于主键 left += 1 while right >= left and theSeq[right] >= pivot: # 确保right指向的元素大于等于主键 right -= 1 if left < right: # 前面两个循环退出的原因有left > right或者theSeq[left] >= pivot以及theSeq[right] < pivot,既然假定left < right,两侧必然有元素错位,将此时两元素交换位置即可 theSeq[left], theSeq[right] = theSeq[right], theSeq[left] if right != first: # 确定主键在排序中应有的位置 theSeq[first] = theSeq[right] theSeq[right] = pivot return right在这段代码中,partitionSeq()函数理解有点费劲。这一函数负责对序列分割,我们拿一个例子来说明。
选定第一个元素10,作为主键。在最开始,left和right分别指向元素23和13。
此时left指向的23大于主键10,跳出第一个内层循环,right指向的13大于主键10,继续向左移动,直至找到一个小于主键的元素或者碰到left,即:
这时候left指向了一个大于主键的元素,而right指向了一个小于主键的元素,并且left < right,将两者交换。
将left和right继续移动,
交换
继续移动left和right,
这时候出现了left > right的情况,而left走过的部分,其元素均小于主键,right走过的部分,其元素均大于主键,因此跳出外层循环。将主键与此时right指向的元素交换位置,即:
此时,就完成了将一个序列按照选定的主键分割成两部分,小于主键的元素在主键的左侧,大于等于主键的元素在主键的右侧。
12.2.3 效率分析
快速排序在平均情况下的时间复杂度是O(n log n),在最坏情况下是O(n²)。
- python数据结构学习笔记-2016-11-24-01-快速排序
- python数据结构学习笔记-2016-10-24-01-排序列表
- python数据结构学习笔记-2016-11-23-01-归并排序
- python数据结构学习笔记-2016-12-03-01-堆排序
- python数据结构学习笔记-2016-11-26-01-链表排序
- 数据结构学习笔记 --- 排序(冒泡排序、快速排序)
- 数据结构学习笔记 --- 排序(冒泡排序、快速排序)
- python数据结构学习笔记-2016-10-23-02-排序
- 数据结构学习--快速排序
- 数据结构学习笔记23 快速排序和基尔排序
- python数据结构学习笔记-2016-10-24-02-使用排序列表实现集合ADT
- python数据结构学习笔记-2016-11-11-01-递归
- python数据结构学习笔记-2016-11-24-02-基数排序
- python数据结构学习笔记-2016-11-07-01-双链表
- python数据结构学习笔记-2016-11-09-01-文本编辑器
- python数据结构学习笔记-2016-11-14-01-散列表
- python数据结构学习笔记-2016-11-20-01-直方图ADT
- python数据结构学习笔记-2016-11-27-01-二叉树
- DrawerLayout及自定义的实现
- 驱动烧写基础
- 函数之间的通信方式
- GreenDao3使用笔记
- 二叉树的非递归遍历
- python数据结构学习笔记-2016-11-24-01-快速排序
- HTTP协议—详解
- 深度学习-序
- OpenGL ES学习之顶点和着色器的定义
- Aho-Corasick算法的Java实现与分析
- poj3034 Whac-a-Mole
- [LeetCode 309] Best Time to Buy and Sell Stock with Cooldown(动态规划及进一步优化)
- java 小结
- 常用内存泄漏的解决