Python实现快速排序--数据结构
快速排序(Quick Sort)
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个元素要O(nlogn)次比较。在最坏状况下则需要O(n^2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他O(nlogn)算法更快,因为它的内部循环可以在大部分的架构上很有效率地被实现出来。
快速排序使用分治策略(Divide and Conquer)来把一个序列分为两个子序列。步骤为:
- 从序列中挑出一个元素,作为"基准"(pivot).一般使用第一个元素或最后一个元素作为比较的基准。
- 把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。
- 对每个分区递归地进行步骤1~2.
Python代码:
def Partition(seq,left,right):
key=seq[right]
tail=left-
for i in range(left,right):
if seq[i]<=key:
tail+=
if tail!=i:
seq[tail],seq[i]=seq[i],seq[tail]
seq[tail+],seq[right]=seq[right],seq[tail+]
return tail+
def QuickSort(seq,left,right):
if left>=right:
return
index=Partition(seq,left,right)
QuickSort(seq,left,index-)
QuickSort(seq,index+,right)
return seq s = [, , , , , , , , , , , , ]
print("before sort:",s)
s1 = QuickSort(s, left = , right = len(s) - )
print("after sort:",s1)
本文将要实现快排的一种思路如下:
第一个函数Partition()的作用是:给定一个序列和序列的起始位置和末尾元素的位置,以末尾元素为基准,将小于基准的数据放在基准的左边,大于基准的数据放在右边,最后返回基准数据的索引下标
第二个函数QuickSort()的作用是不断的递归循环,直到出现left>=right的情况结束
其中,最难理解的是Partition函数。在这里做如下解释:
例如一组数据:s = [6, 8, 1, 4, 3, 9, 5, 4, 11, 2, 2, 15, 7],n=siezof(s)
第一步:以序列的最后一个元素作为基准,pivot=7
第二步:从左到右遍历前n-1个元素,这里先借助一个辅助变量tail,tail的作用是作为一个索引,用来表示遍历过程中,所有比基准小的数组成的子序列中的最后一个元素的索引。特别绕!例如遍历s,一个元素6要比pivot=7小,所以子序列为[6],tail值为0,然后继续向前遍历,第二个元素8比pivot大,跳过,遍历第三个元素1要比pivot小,那么子序列为[6,1],tail值为2,遍历第四个元素4要比pivot小,那么子序列为[6,1,4],tail值为3,.。。。最后tail+1即为pivot=7在原序列中的位置。
C代码:摘自:http://www.cnblogs.com/eniac12/p/5329396.html
#include <stdio.h> void Swap(int A[], int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
} int Partition(int A[], int left, int right) // 划分函数
{
int pivot = A[right]; // 这里每次都选择最后一个元素作为基准
int tail = left - ; // tail为小于基准的子数组最后一个元素的索引
for (int i = left; i < right; i++) // 遍历基准以外的其他元素
{
if (A[i] <= pivot) // 把小于等于基准的元素放到前一个子数组末尾
{
Swap(A, ++tail, i);
}
}
Swap(A, tail + , right); // 最后把基准放到前一个子数组的后边,剩下的子数组既是大于基准的子数组
// 该操作很有可能把后面元素的稳定性打乱,所以快速排序是不稳定的排序算法
return tail + ; // 返回基准的索引
} void QuickSort(int A[], int left, int right)
{
if (left >= right)
return;
int pivot_index = Partition(A, left, right); // 基准的索引
QuickSort(A, left, pivot_index - );
QuickSort(A, pivot_index + , right);
} int main()
{
int A[] = { , , , , , , , , }; // 从小到大快速排序
int n = sizeof(A) / sizeof(int);
QuickSort(A, , n - );
printf("快速排序结果:");
for (int i = ; i < n; i++)
{
printf("%d ", A[i]);
}
printf("\n");
return ;
}
Python实现快速排序--数据结构的更多相关文章
- 用Python实现的数据结构与算法:开篇
一.概述 用Python实现的数据结构与算法 涵盖了常用的数据结构与算法(全部由Python语言实现),是 Problem Solving with Algorithms and Data Struc ...
- Python 中的数据结构总结(一)
Python 中的数据结构 “数据结构”这个词大家肯定都不陌生,高级程序语言有两个核心,一个是算法,另一个就是数据结构.不管是c语言系列中的数组.链表.树和图,还是java中的各种map,随便抽出一个 ...
- python 下的数据结构与算法---8:哈希一下【dict与set的实现】
少年,不知道你好记不记得第三篇文章讲python内建数据结构的方法及其时间复杂度时里面关于dict与set的时间复杂度[为何访问元素为O(1)]原理我说后面讲吗?其实就是这篇文章讲啦. 目录: 一:H ...
- Python算法与数据结构--求所有子数组的和的最大值
Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室-玄魂 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个 ...
- Python中的数据结构
Python中的数据结构 这里总结一下Python中的内置数据结构(Built-in Data Structure):列表list.元组tuple.字典dict.集合set,涵盖的仅有部分重点,详细地 ...
- Python与快速排序
这个算法系列主要是自己学习算法过程中动手实践一下,写这个文章作为笔记和分享个人心得,如有错误请各位提出. 注:转载请说明出处 问题提出: 将以下数据升序排列:5, 2, 8, 6, 4, 9, 7, ...
- Python 下的数据结构实现
既然采用了 Python 编程语言实现数据结构,就要充分发挥 Python 语言的语法特性. 参考<Python 算法教程><数据结构与算法 -- Python 语言描述>: ...
- Python入门篇-数据结构堆排序Heap Sort
Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点 ...
- Python入门篇-数据结构树(tree)的遍历
Python入门篇-数据结构树(tree)的遍历 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.遍历 迭代所有元素一遍. 二.树的遍历 对树中所有元素不重复地访问一遍,也称作扫 ...
随机推荐
- day23 Pythonpython 本文re模块
re模块用于对python的正则表达式的操作. 字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配 ...
- solaris下安装oracle 11g与11g rac
1.To Find Swap, RAM, and OS Version 对于 Solaris 操作系统,查看 Swap, RAM, and OS Version 的方法: swap -l /usr/s ...
- 【转】打包 压缩 命令tar zip
https://www.cnblogs.com/centos2017/p/7896807.html tar语法 #压缩tar -czvf ***.tar.gztar -cjvf ***.tar.bz2 ...
- Csharp—碎片知识积累
1.获取应用程序的工作目录 2.将两个字符串组成一个新的路径: 3.MessageBox使用(弹出一个消息框)(第一个参数是消息内容,第二个参数是消息标题,第三个参数是按钮设置,第四个参数是消息内容前 ...
- Recurrent Neural Network[survey]
0.引言 我们发现传统的(如前向网络等)非循环的NN都是假设样本之间无依赖关系(至少时间和顺序上是无依赖关系),而许多学习任务却都涉及到处理序列数据,如image captioning,speech ...
- 联合索引在B+树上的结构
一级索引 二级联合索引 假设这是一个多列索引(col1, col2,col3),对于叶子节点,是这样的: PS:该图改自<MySQL索引背后的数据结构及算法原理>一文的配图. 也就是说, ...
- XenServer 5.5 断电重启虚拟机磁盘丢失的修复
1.现象 公司云平台使用的是XenServer 5.5,版本比较老了.最近几天因为机房改造,导致云环境断电,重启之后发现有2台机器无法ping到,所以再次重启,登录修复网卡,最后发现无法用XenCen ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 树形选择项目的标准例子
用成套的现成的方法引导大家开发程序,整个团队的开发效率会很高.例如我们现在有30多个开发人员,若有300个开发人员,这开发工作很容易乱套,我们需要有效的管理维护所有团队的开发工作.把数据结构.通用的组 ...
- docker环境搭建
参考地址:https://www.imooc.com/article/details/id/25228 操作系统Centos7 1.替换yum源为阿里云yum源: //备份yum源 mv /etc/y ...
- sql存储过程中使用 output、nvarchar(max)
1.sql存储过程中使用 output CREATE PROCEDURE [dbo].[P_Max] @a int, -- 输入 @b int, -- 输入 @Returnc int output - ...