首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

稳定的原地排序算法选择排序

最后,我们也从两个算法入手,引出了评价算法性能的两个重要指标:是否原地排序算法算法稳定性。今天我们再来说一种原地排序算法:** 选择排序**。...排序算法分析 和插入排序与冒泡排序算法文章类似,在文章末尾,我们还是照常来分析分析选择排序算法。 是否原地排序算法 先来回顾一下,什么原地排序算法。...原地排序算法指:数组排序前后,不占用额外内存空间。 答案显而易见,选择排序排序前后只有位置的交换,并没有占用额外存储空间,所以选择排序算法原地排序算法。...是否稳定算法 同样的,回顾一下,什么稳定算法稳定算法指:如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。 选择排序一种不稳定排序算法。...正是因此,相对于冒泡排序和插入排序选择排序就稍微逊色了。 简单总结一下,本文讲了一个不稳定的原地排序算法选择排序。从示意图一步一步的分析选择排序,引出选择排序算法算法复杂度。

2.4K20

算法-排序算法-选择排序

/** * 排序算法-选择排序 * 选择排序(Selection Sort)算法也是比较简单的排序算法,其思路比较直观。选择排序算法在每一步中选取最小值来重新排列,从而达到排序的目的。...* 选择排序算法通过选择和交换来实现排序,其排序流程如下: * (1)首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换。...* (2)接着从剩下的n-1个数据中选择次小的1个数据,将其和第2个位置的数据交换。 * (3)然后不断重复上述过程,直到最后两个数据完成交换。至此,便完成了对原始数组的从小到大的排序。...* * 选择排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行n-1步的中间排序。 * 这种排序方法思路很简单直观,但是缺点执行的步骤稍长,效率不高。...size; i++) { ints[i] = (int)(Math.random() * 100 ); } System.out.println("排序前的数组

1.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

排序算法---选择排序

排序我们学习算法过程中重要且基础的一环,例如对下面的排序问题,我们应该怎么做呢?...选择排序思想和实现思路 提到排序问题,很容易想到的思路就是找出来所有数据中最大(或最小)的元素,放在一个新列表的第一位,然后再在剩下的元素中找出最大(或最小)的元素,放在新列表的第二位,以此类推......这就是选择排序(selection sort)的算法思想。 上图就是选择排序算法思想,但一个算法的实现往往不能通过一个简单的思想就搞定(这就是思想与现实的距离,哈哈~)。...选择算法的实现并不会新建一个空白列表(因为这样太奢侈了),而是直接在原列表上进行操作:首先先从列表中找出最大(或者最小)的元素,将其与列表中的第一个元素互换位置,然后再从剩余元素中挑选出最大(或者最小)...{ int maxValueIndex = i; for (int j = i + 1; j < size; ++j) { // 这里用来决定算法升序还是降序

66210

排序算法-选择排序

算法简介 选择排序就是找到数组中最小元素将其和数组第一个元素交换位置,然后在剩下的元素中找到最小元素并将其与数组第二个元素进行交换,以此类推,直至整个数组排序结束。...算法描述 找到数组中最小元素并将其和数组第一个元素交换位置 在剩下的元素中找到最小元素并将其与数组第二个元素交换,直至整个数组排序 ?...代码实现 /** * 选择 * * @param array */ private static void selectionSort(int[]...由于每次都是选取未排序序列R中的最小元素 a 与 R 中的第一个元素交换,很可能破坏了元素间的相对位置,因此选择排序稳定的。...排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定选择排序 \(O(n^2)\) \(O(n^2)\) \(O(n^2)\) \(O(1)\) 不稳定

1.6K40

排序算法】冒泡排序选择排序

冒泡排序 思想 冒泡排序,又被称为气泡排序或泡沫排序。...arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } if (flag == 1)//如果已经有序,提前跳出循环 break; } } 算法分析...时间复杂度:最坏O(N^2),最好O(N),平均时间复杂度O(N^2) 空间复杂度:O(1) 选择排序 思想 首先在未排序的数组中找到最大或者最小的元素,然后将其放在起始位置,同理,在未排序的数组中继续寻找最大或最小的数...begin <= end) { int mini = begin; int maxi = begin; for (int i = begin + 1; i <= end; i++)//保存的下标...最大的数的位置就发生了变化,第二次交换,最大的数就不能换到最后面 { maxi = mini; } swap(&a[maxi], &a[end]); begin++; end--; } } 算法分析

12010

算法渣-排序-选择排序

没有一身好内功,招式再多都是空;算法绝对防身必备,面试时更是不可或缺;跟着算法渣一起从零学算法 定义 选择排序(Selection sort)一种简单直观的排序算法。...以此类推,直到全部待排序的数据元素排完。 选择排序稳定排序方法。...算法 n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: 初始状态:无序区为R[1..n],有序区为空 第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第...(初始)的数据有关,最优情况只有O(n);而选择排序不论如何,永远都是O(n^2) 插入排序边读边排,每当读入一个新的数时,目前的数组一定是排好序的。...而选择排序不同,它必须读完所有的数据之后才能开始排序的。 那么选择排序的缺点就是,万一数据量很大,比方说一百万个,光读就慢了,还要排序,那就更慢了。

76720

排序算法(二):选择排序

选择排序算法维护一个待排序集合和一个已排序集合,每轮迭代,从待排序集合中选择一个最小(最大)元素,添加到已排序集合中,通过多次迭代,最终完成排序。...不同之处在于冒泡排序的极值元素通过不断的比较和交换位置产生的,选择排序则是不断比较和一次交换位置产生,所以相对冒泡排序,性能上具有优势。...] 已排序集合:[] 初始状态为: 根据算法过程: 步骤一, 初始值设为 0,指向元素 6,从下标为 1 的元素开始,比较 指向的值 和 3,比较大小后,选择下一个元素,比较 指向的值...算法分析 在每一轮排序过程中,选择出极值后,通过直接交换元素位置的方式生成已排序元素的,所以选择排序一种非稳定排序。...算法执行过程中,不需要申请额外的序列空间来保存临时元素,属于原地排序方式,所以算法的空间复杂度为 。

85610

详解排序算法--堆排序选择排序排序

选择排序 选择排序(Selection sort)一种简单直观的排序算法。它的工作原理如下。...选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。...选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。 ? !...这就是堆排序的由来 堆排序排序(Heapsort)指利用堆这种数据结构所设计的一种排序算法。...堆排序的过程: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 把堆的尺寸缩小1,并调用shift_down(0),目的把新的数组顶端数据调整到相应位置 重复步骤2,直到堆的尺寸为1 伪

96430

排序算法】冒泡排序选择排序、插入排序

选择排序稳定排序算法,即对于值相同的数据元素,彼此的前后顺序可能会发生改变。 对比冒泡排序 与冒泡排序不同: 冒泡排序逐趟选出未排序序列中的最大值,置于右侧。...选择排序逐趟选出未排序序列中的最小值,置于左侧。 冒泡排序会两两比较相邻元素,将较大值通过多次交换移动到数列右侧,第i趟最多交换n-i次。...不同于冒泡排序选择排序每趟排序最多只会改变两个元素的位置。不能设置flag检查是否排序完成,也无法通过flag检查。 选择排序需要遍历剩余所有元素,内层循环不能同冒泡循环一样修改右边界。...对于选择排序,有序序列默认在左端,右侧为无序序列,我们采取的方式调整左边界。内层循环的计数器初始值随趟数改变而改变,是为了保证每趟都指向无序序列的第一个元素,并能够遍历无序序列的每一个元素。...对于插入排序,有序序列默认在左端,我们需要取出无序序列中的元素之后遍历有序序列,寻找合适位置。由于有序序列有序的,我们可以选择一个方向,寻找介于两个元素之间的位置插入。

16330

选择排序算法

冒泡排序算法算法与数据结构中最基础的排序算法。学会这个算法有必要,在2010年左右的时候,很多时候面试都会冒泡排序算法。那时候IT行业没现在这么卷,大部分都考察一下冒泡排序就OK了。...那现在有必须在学习冒泡排序吗?当然有必要,基础算法必须掌握,体现你的技术热情,对走技术路线有绝对的帮助的。 冒泡排序就是排队一样,矮的排前面,高的排后面。 ...刚开始乱序的,那就从第一个开始调整,把最高排到后面。排完这个之后,这个位置就被占用。 那再从第一个开始,再找出一个最高的放在倒数第二个位置。 周而复始一直到第一个位置确定好。...与第一趟 一样的,只是范围变窄了。...冒泡排序稳定排序, 时间复杂度o(n^2) 看一个简单例子: 5, 3, 2, 1 一趟冒泡如何进行 第一次比较 :5,  3, 2, 1 ;5和3需要调换位置 :  3,  5, 2, 1

77830

经典排序算法(二)选择排序

选择排序原理 选择排序一种简单排序算法。这是一个基于位置比较的算法,通常实现是左边已经排好序的元素列表,右边排序的元素。当然,一开始的时候,我们认为都是未经排序的。...选择排序的精髓:与冒泡排序不同,选择排序第N趟排序先确定最小元素的位置,然后和第N个元素交换位置。主要特点每一趟选择一个最小值的索引作为梅一堂最后交换的位置。...至此,选择排序算法结束,选择排序算法复杂度O(N),比较次数N-1、N-2、…、1,交换次数N。...后面的排序过程以此类推,以下整个排序过程: 最后展示完整的选择排序代码: package org.byron4j.sort; /** * * @author Byron.Y.Y *...@version 1.0 * Java-选择排序-以整形数组为例 */ public class SelectionSort { /** * 注意:该方法仅仅展示选择排序的过程

36420

排序算法选择排序和堆排序

选择排序 简单选择排序排序 简单选择排序 选择排序属于内部排序法, 从想要排序的数据中, 按指定的规则选出某一个元素, 再依规定的交换位置后达到排序的目的 选择排序(select...第i次从arr[i-1]~arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个按排序从小到大排列的有序序列..., 根据情况重置相关元素 每个大循环的结束时, 需要根据情况交换元素 /** * 选择排序(正序)-时间复杂度 O(n^2) * * @author TimePause * @create 2020...堆排序基于二叉树实现的, 因此在学习堆排序时, 最好先学习一下树这种结构结构 堆排序利用堆这种数据结构而设计的一种排序算法,堆排序一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn...),它也是不稳定排序

55220
领券