排序(二)快速排序
2016-01-16 15:22
134 查看
基本思想
首先要找一个数作为基准数,用于参照比较。所有比基数大的都放在基数的右边,比基数小的都放在基数的左边。1. 先选择最左端的一项作为
基准数。
2. 分别从左端和有段选择一项作为
哨兵i和
哨兵j。
3.
基准数在左,在右端的
哨兵j先动(从右向左,i从坐向右)。
4.
哨兵i关注小于
基准数。
哨兵j关注大于
基准数。
例子代码
a = [9, 4, 7, 3, 1, 5, 8, 6, 2] def quicksort(left, right): if left > right:#如果左侧哨兵 比右侧哨兵大,说明在进入递归之前,左侧哨兵比右侧哨兵大 return tmp = a[left]#获得最左侧元素作为基准数 i = left j = right while i != j : #先从右往左找,关注比基准数小的,如果大于基准数,哨兵j左移(-1),找到了a[j] while a[j] >= tmp and i < j: j = j - 1 #如果j找到了比基准数小的数,跳出循环。哨兵i继续找,哨兵i关注比基准数大的,如果小于基准数,哨兵i右移(+1),找到了a[i] while a[i] <= tmp and i < j: i = i + 1 #交换两个数(a[i],a[j])在数组中的位置 if i < j:#如果哨兵i和哨兵j没有相遇时 t = a[i] a[i] = a[j] a[j] = t #将基准数归位,左侧都为小于基准数的,右侧都为大于基准数的。 a[left] = a[i] a[i] = tmp quicksort(left,i - 1)#基准数左侧的继续排序 quicksort(i + 1, right)#基准数右侧的继续排序 return if __name__ == '__main__': print("-------------------- quick sort --------------------") print(a) quicksort(0, len(a) - 1) print(a)
相关文章推荐
- 快速排序
- C#快速排序算法实例分析
- C++快速排序的分析与优化详解
- php简单实现快速排序的方法
- Java 快速排序(QuickSort)原理及实现代码
- 快速排序和分治排序介绍
- java 算法之快速排序实现代码
- Java实现快速排序算法(Quicktsort)
- Java中的数组排序方式(快速排序、冒泡排序、选择排序)
- C/C++实现快速排序的方法
- c语言实现冒泡排序、希尔排序等多种算法示例
- 深入单链表的快速排序详解
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- JavaScript实现快速排序的方法
- C#使用委托实现的快速排序算法实例
- C语言的冒泡排序和快速排序算法使用实例
- javascript与Python快速排序实例对比
- php实现快速排序的三种方法分享
- PHP两种快速排序算法实例
- 排序算法之PHP版快速排序、冒泡排序