快速排序算法学习总结

排序算法有很多种,如冒泡排序、堆排序、快速排序等;

冒泡排序是大学的初学算法,也被很多人所熟知,这里不详细讨论,实现方式如下:

快速排序使用分治法,将一个list分为两个子list:

算法步骤:
1 从数列中挑出一个元素,作为基准,
2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作。
3 递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一

以上为分区操作,随机选择一个基准,将list以基准为中心进行左右分区,返回新列表的基准所在位置

以上为递归排序执行部分,之所以自己写数组切分方法,而不是直接使用列表的subList方法,是因为subList方法是使用的游标切分列表,获取的子列表的元素和原有列表使用的是同一地址,

修改其中任一列表的元素,另一列表也会跟着改变。这里需要把列表切分成两个独立的子列表。

另外简单记录下两个较为实用的查找算法

二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜 素过程结束;

如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组 为空,则代表找不到。

线性查找算法:
算法解决的问题是从某n个元素的序列中选出第k大(第k小)的元素

算法步骤:
1、将n个元素每5个一组,分成n/5(上界)组。
2、取出每一组的中位数,任意排序方法。
3、递归的调用selection算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。
4、用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。
5、若i==k,返回x;若i<k,在小于x的元素中递归查找第i小的元素;若i>k,在大于x的元素中递归查找第i-k小的元素。
终止条件:n=1时,返回的即是i小元素。

原文地址:https://www.cnblogs.com/monkey-hong/p/9120680.html

时间: 2024-10-19 10:42:15

快速排序算法学习总结的相关文章

排序算法学习之快速排序

快速排序基本思想:选取一个枢轴元素(图简单可选第一个),通过对序列一次遍历(中间涉及到数的交换),将该枢轴放置到序列合适位置,保证其左边数都比它小,右边数都比它大,然后利用递归思想对其左右两个子序列进行同样排序. 快熟排序的基本实现过程:将枢轴元素key备份,序列头尾各设置一个游标--i和j,尾部游标j先移动(如果选择的最后一个元素为枢轴则i先移),直到遇到比key小的元素,将其移到原枢轴处覆盖之,此时j处元素空着了,然后再对i进行移动,直到遇到比key大的元素,将其移到右边下表为j的空白处 v

经典排序算法学习笔记之二——快速排序

一.快速排序 数据结构 不定 最差时间复杂度 O(n^2) 最优时间复杂度 O (n*log n) 平均时间复杂度 O (n*log n) 最差空间复杂度 根据实现的方式不同而不同 https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F 1.算法思想: 从数列中挑出一个元素,称为"基准"(pivot), 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边

快速排序算法小结

         快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列.          假设要排序的数组是a[6],长度为7,首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序.一躺快速排序的算法是: 1).设

快速排序算法的两个写法

快速排序作为应用比较广泛,而且时间复杂度比较优越的排序算法备受大家的喜爱.最近有点悠闲,就又把这个快速算法研究了一遍,目前掌握了两种排序算法的思路,为了以免忘记,故详细的记录下来,也供大家学习借鉴,不足之处望请指教. 快速排序的基本原理: 假设一个待排序的数组如上图所示,排序的目的就是将其从小到大排序.快速排序的主要步骤就是设定一个待排序的元素(称作主元,记作temp),经过一轮划分排序后在这个主元左边的元素值都小于它,在主元右边的元素值都大于它,一轮划分后的效果应该是这样的,如下图: 这样以t

快速排序的学习(基于Go)

快速排序中的算法思想 1. 分治思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题.递归地解这些子问题,然后将这些子问题的解组合为原问题的解. 我们可以利用分治思想将杂乱无序的数组Arr[p,,r]分为以下几个步骤 1.分解: 在数组Arr[p,,r]中找出主元x,并且依据这个x对原始的数组进行分解成两个数组Arr[p,,,q - 1]和Arr[q + 1,,r]是的任何一个属于Arr[p,,,q - 1]的元素都要小于Arr[q] 任何一个属于Arr[q + 1,

算法学习——分治算法

这是从网上查到的概念资料,先收来~ 一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关.问题的规模越小,越容易直接求解,解题所需的计算时间也越少.例如,对于n个

算法学习知识点

 ACMer必备知识(这么多呀,慢慢学了-- 图论 路径问题 0/1边权最短路径 BFS 非负边权最短路径(Dijkstra)   (可以用 Dijkstra解决问题的特征) 负边权最短路径   Bellman-Ford Bellman-Ford的 Yen-氏优化 差分约束系统 Floyd 广义路径问题   传递闭包 极小极大距离 /极大极小距离 Euler Path / Tour 圈套圈算法 混合图的 EulerPath / Tour  Hamilton Path / Tour 特殊图的

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算

算法学习01:二分查询,选择法、插入法、分治法排序

查询与排序是使用的再频繁不过的两个功能,算法学习系列实现语言为C#. 一般情况下的查询 Int32 Search(Int32[] source, Int32 task) { var index = 0; while (index < source.Length) if (source[index++] == task) return index - 1; //返回值为Length则说明未找到 return source.Length; } 时间复杂度为O(n),在检索源没有排序的情况下,这即为最