数据结构与算法-----快速排序

  快速排序的原理是,每一次排序都找一个基准数,然后比基准数大的元素,放到基准数的右侧,比基准数小的元素放到基准的左侧,那么最核心的就是找到基准数的位置, 把基准数放到它应在的位置。现在我们对6 1 2 7 9 3 4 5 10 8 进行排序。

   首先找一个基准数,就是一个参照数, 用来进行比较。 为了简单起见,那就选第一个数6作为基准数好了,我们要做的事就是找到6 所在的位置,让6右边的数比它大,让6左边的数比它小 如下形式。

  3 1 2 5 4 6 7 9 10 8

  我们怎么才能找到6 应该在的位置呢? 方法很简单,那就是从序列3 1 2 5 4 6 7 9 10 8 的两端进行探测。先从序列的右侧进行查找, 只要找到一个比基准数6大的数就停下来,然后再从序列的左边进行查找,只要找到一个比基准数6小的数就停止,这时交换它们两个的位置。 这时我们可以用两个变量i 和 j 分别指向序列的最左侧和最右侧。刚开始的时候,变量i 指向序列的最左边,就是数字6, j指向序列的最右边,指向数字8, 如下图所示

  首先j 从右向左移动,只要找到比6小的数就停止下来,j到了5的位置。这时i 再从左向右出发, 只要找到比6大的数就停止下来,所以它到了7的位置

  这时交换这两个数的位置

  第一次交换结束,序列变成了 6, 1, 2, 5, 9 , 3 5, 7, 10, 8.  数字5 和数字7进行了交换。现在j 接着向左走,到了4的位置就停下来,因为4也比6小。这时i 接着从左向右走,到了9的位置,9比6 大。

  然后再交换它们的位置

  又一次的交换结束了,我们的序列变成了 6 1 2 5 4 3 9 7 10 8 。 现在接着继续探测, j 接着向左走,到了3的位置就停止了,它比6小。 接着i向右走,突然发现i和j 相遇了,都到了3的位置上,表明探测结束了。

  基准数6的位置应该在3的位置上,我们来交换3和6位置

到这时我们终于找到的6的位置,比6大的数在它的右侧,比6小的数在它的左侧

  

时间: 2024-08-02 08:46:07

数据结构与算法-----快速排序的相关文章

[数据结构和算法]快速排序笔记

特点:1.是冒泡的改进2.是一个递归的过程3.不稳定 4.时间复杂度:O(nlogn) 设要排序的数组是A[0]...A[n-1],首先取数组的第一个数作为关键数据,然后将所有比它小的数都放到它的前面,比他大的都放到他的后面,这个过程被称为一趟快速排序 算法步骤:1.设置两个变量i,j,排序开始i = 0, j = N-1;2.以第一个数组元素作为关键字,Key = A[0];3.从J开始向前搜索,即由后开始向前搜索j--, 找到第一个小于key的值A[j],将A[j]赋值给A[i]4.从I开始

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序的是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希尔(shell)排序 希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示: ==> 图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动 如图3所示,相比插入排序

python数据结构与算法 35 快速排序

快速排序 快速排序也使用了分而治之的策略来提高性能,而且不需要额外的内存,但是这么做的代价就是,列表不是对半切分的,因而,性能上就有所下降. 快速排序选择一个数值,一般称为"轴点",虽然有很多选取轴点的方法,我们还是简单地把列表中第一个元素做为轴点了.轴点的作用是帮助把列表分为两个部分.列表完成后,轴点所在的位置叫做"切分点",从这一点上把列表分成两部分供后续调用. 图12所示,54将作为轴点.这个例子我们已经排过多次了,我们知道54在排好序后将处于现在31的位置上

算法与数据结构(七):快速排序

在上一篇中,回顾了一下针对选择排序的优化算法--堆排序.堆排序的时间复杂度为O(nlogn),而快速排序的时间复杂度也是O(nlogn).但是快速排序在同为O(n*logn)的排序算法中,效率也是相对较高的,而且快速排序使用了算法中一个十分经典的思想--分治法:因此掌握快速排序还是很有必要的. 快速排序的基本思想如下: 在一组无序元素中,找到一个数作为基准数. 将大于它的数全部移动到它的右侧,小于它的全部移动到右侧. 在分成的两个区中,再次重复1到2 的步骤,直到所有的数全部有序 下面还是来看一

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数

数据结构与算法

1. 解决一个复杂的问题的时候,肯能先想到的是如何建模,建模之后,怎么去求解这个问题.求解一个问题的时候,需要用到算法的时候,我们应该想到的是该算法需要什么样的数据结构.可能涉及一个算法最原始的数据结构,可能就比较复杂. 怎么样对一个算法来进行优化,我想从学完数据结构的角度来谈谈,总共有3个方面: 第一:可能就是算法本身,比如在排序过程中,我们知道快速排序在相对的情况下,要比冒泡排序更加高效,这就是为什么都是排序,我们为什么不选择好的算法,从算法本身来下手呢? 第二:可能就是合适的数据结构,能够

面试常考数据结构与算法

数据结构部分: 1.数组和链表的区别.(很简单,但是很常考,记得要回答全面) C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小.而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费.链表是一种常见的数据组织形式,他采用动态分配内存的形式实现.需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费. 从逻辑结构上来看

数据结构与算法系列 目录

最近抽空整理了"数据结构和算法"的相关文章.在整理过程中,对于每种数据结构和算法分别给出"C"."C++"和"Java"这三种语言的实现:实现语言虽不同,但原理如出一辙.因此,读者在了解和学习的过程中,择其一即可! 下面是整理数据数据和算法的目录表,对于每一种按照C/C++/Java进行了划分,方便查阅.若文章有错误或纰漏,请不吝指正.谢谢! 数据结构和算法目录表   C C++ Java 线性结构 1. 数组.单链表和双链表

数据结构与算法知识大纲

数据结构与算法 1.线性结构 (1)线性表 ①线性表的定义 ②线性表的存储结构 ③线性表的应用 (2)栈和队列 ①栈 ②队列 (3)串 ①串的定义及基本运算 ②串的存储结构 2.数组和矩阵 (1)数组 (2)矩阵 3.树和图 (1)树 ①树的定义 ②二叉树的定义和基本运算 ③二叉树的性质 ④二叉树的存储结构 ⑤二叉树的遍历 ⑥最优二叉树 ⑦二叉查找树 (2)图 ①图的定义及术语 ②图的存储结构 4.常用算法 (1)算法概述 ①算法的基本概念 ②算法与数据结构 ③算法的描述 ④算法效率 (2)排序