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

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

/** * 排序算法-选择排序 * 选择排序(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

java几种排序算法(常用排序算法)

大家好,又见面了,我是你们朋友全栈君。 常见几种java排序算法 1.插入排序 2.分治排序法,快速排序法 3.冒泡排序 low版 4.冒泡排序 bigger版 5.选择排序 6....快速排序法 简单说, 就是设置一个标准值, 将大于这个值放到右边(不管排序), 将小于这个值放到左边(不管排序), 那么这样只是区分了左小右大, 没有排序, 没关系, 左右两边再重复这个步骤.直到不能分了为止...层层细分 接下来,我们通过示图来展示上述分区算法思路过程: public class QuickSort { public static void sort(int[] arr...选择排序也是一种简单直观排序算法,实现原理比较直观易懂: 首先在未排序数列中找到最小元素,然后将其与数列首部元素进行交换,然后,在剩余未排序元素中继续找出最小元素,将其与已排序数列末尾位置元素交换...这也容易理解为什么选择排序为啥比插入排序慢了. 插入排序是摸一张牌, 然后直接插入到手中已经排好序牌,再摸下一张牌. 选择排序相当于在一堆牌中, 不断找到最小牌往前面放.

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

算法-排序算法-冒泡排序

/** * 排序算法-冒泡排序 * 冒泡排序(Bubble Sort)算法是所有排序算法中最简单、最基本一种。 * 冒泡排序算法思路就是交换排序,通过相邻数据交换来达到排序目的。...* 冒泡排序思路: * (1)对数组中各数据,依次比较相邻两个元素大小。 * (2)如果前面的数据大于后面的数据,就交换这两个数据。经过第一轮多次比较排序后,便可将最小数据排好。...* 冒泡排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行(i = n-1)次外层循环。...* 每次内部排序随着步骤递增,需要排序数据逐步减少,所以需要 (n - i)次内层循环,注意:i从1开始 */ import java.util.*; public class BubbleSort...:" + Arrays.toString(ints)); } System.out.println("最终排序数组:" + Arrays.toString(ints)

92020

算法-排序算法-快速排序

/** * 排序算法-快速排序 * 快速排序(Quick Sort)算法和冒泡排序算法类似,都是基于交换排序思想。快速排序算法对冒泡排序算法进行了改进,从而具有更高执行效率。...* 快速排序算法通过多次比较和交换来实现排序,过程如下: * (1)首先设定一个分界值,通过该分界值将数组分成左右两部分。...* (3)然后,左边和右边数据可以独立排序。对于左侧数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样将左边放置较小值,右边放置较大值。右侧数组数据也可以做类似处理。...通过递归将左侧部分排好序后,再递归排好右侧部分顺序。当左、右两部分各数据排序完成后,整个数组排序也就完成了。...:" + Arrays.toString(ints)); quickSortFun(ints, 0, size - 1); System.out.println("排序数组

85410

算法-排序算法-希尔排序

/** * 排序算法-希尔排序 * 冒泡排序算法、选择排序算法和插入排序算法,虽然思路比较直观,但是排序效率比较低。 * 对于大量数据需要排序时,往往需要寻求其他更为高效排序算法。...Shell排序算法便是其中一种 * Shell排序算法严格来说基于插入排序思想,其又称为希尔排序或者缩小增量排序,思路如下: * (1)将有n个元素数组分成n/2个数字序列,第1个数据和第n/2...size; i++) { ints[i] = (int)(Math.random() * 100 ); } System.out.println("排序数组...ints[j+r] = temp; } x++; System.out.println("第" + x + "步排序结果...:" + Arrays.toString(ints)); } System.out.println("排序数组:" + Arrays.toString(ints))

71720

常用链表排序算法_单链表排序算法

(由小到大) 返回:指向链表表头指针 ========================== */ /* 选择排序基本思想就是反复从还未排好序那些节点中, 选出键值(就是用它排序字段...=========== */ /* 直接插入排序基本思想就是假设链表前面n-1个节点是已经按键值 (就是用它排序字段,我们取学号num为键值)排好序,对于节点n在 这个序列中找插入位置...在排序中,实质只增加了一个用于指向剩下需要排序节点头指针first罢了。 这一点请读者务必搞清楚,要不然就可能认为它和上面的选择排序法一样了。...即:每当两相邻节点比较后发现它们排序排序要求相反时, 就将它们互换。...,排序后图16中p1->next->next要指的是p2->next,所以p1->next->next=p2->next; 3、在图15中p2->next原是q发出来指向,排序后图16中q指向要变为指向

56620

算法-排序算法-插入排序

/** * 排序算法-插入排序 * 插入排序(Insertion Sort)算法通过对未排序数据执行逐个插入至合适位置而完成排序工作。 * 插入排序算法思路比较简单,应用比较多。...* 插入排序算法通过比较和插入来实现排序,其排序流程如下: * (1)首先对数组前两个数据进行从小到大排序。 * (2)接着将第3个数据与排好序两个数据比较,将第3个数据插入合适位置。...* (3)然后,将第4个数据插入已排好序前3个数据中 * (4)不断重复上述过程,直到把最后一个数据插入合适位置。最后,便完成了对原始数组从小到大排序。...* * 插入排序算法在对n个数据进行排序时,无论原数据有无顺序,都需要进行n-1步中间排序。 * 这种排序方法思路简单直观,在数据已有一定顺序情况下,排序效率较好。...但如果数据无规则,则需要移动大量数据,其排序效率也不高。

57220

Js排序算法_js 排序算法

大家好,又见面了,我是你们朋友全栈君。 一、概念 快速排序算法由 C. A. R. Hoare 在 1960 年提出。...它时间复杂度也是 O(nlogn),但它在时间复杂度为 O(nlogn) 级几种排序算法中,大多数情况下效率更高,所以快速排序应用非常广泛。...快速排序一次划分算法从两头交替搜索,直到low和high重合,因此其时间 复杂度是O(n) ; 而整个快速排序算法时间复杂度与划分趟数有关。...这样,长度为n数据表快速排序需要经过n趟划分,使得整个排序算法时间复杂度为O(n2)。 如果需要优化,那么我们希望每次区分时候都取到中间数。...JavaScript实现五种排序算法 关于快速排序不稳定性说明 JavaScript实现十大排序算法(附有更好理解GIF动态图) 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人

25.2K20

算法——排序算法

,则进行交换,第二步完成数组是arr={35,99,12,18,76},以此类推,接着比较剩下来数,最后最小数12将来到数组最后一位,第一次冒泡排序数组是arr={35,99,18,76,12...12已经在数组最后一位了,那么第二次冒泡则不需要比较数组最后一位数,第二次冒泡完成 第三次冒泡:排序后结果:arr={99,76,35,18,12} 第四次冒泡:排序后结果:arr={99,76,35,18,12...: 原理:每一次循环从未排序数中找出最小数,然后与已经排好序下一个数进行交换,直到全部记录排序完毕 基本思想:给定数组:int[] arr={里面n个数据},第一次排序从arr[0]~arr[...n-1]中找出最小数据,然后将这个最小数与arr[0]交换;第二次排序从arr[1]~arr[n-1]找出最小数,然后将这个最小数与arr[1]交换,以此类推,第i次排序在arr[i-1]~arr...[n-1]中找出最小数与arr[i-1]交换,直到全部排序完毕。

59810

排序算法 --- 希尔排序

一、排序思想 之前说到插入排序,希尔排序就对其进行了一个优化,优化思路是: 对待排序列进行分组,组数为gap = arr.length / 2; 对每一组进行插入排序,然后再进行分组,gap = gap.../ 2; 再对每一组进行插入排序,直到最后组数为1,再进行最后一次插入排序即可; ---- 欢迎大家关注我公众号 javawebkf,目前正在慢慢地将简书文章搬到公众号,以后简书和公众号文章将同步更新...刚才说了,希尔排序主要思想就是分组,对每一组分别进行插入排序,那代码就简单了,就是这分组里面将之前插入排序代码拷过来稍微改改就行了。...,以前插入排序代码是这样: for(int i=1; i<arr.length; i++) { // 默认第一个是有序表,从第二个元素开始进行插入排序 int insertVal = arr...聪明你肯定发现了,以前只有一组,每次比较时候,步长是1,现在步长是gap,所以,只要将以前插入排序循环中1都改成gap就行了,完整代码如下: public static void mySort(int

47031

排序算法】希尔排序

希尔排序( 缩小增量排序 ) 希尔排序是一种经典排序算法,它通过多次插入排序方式,以及逐步缩小增量策略,实现对数据高效排序,希尔排序法又称缩小增量法。...分组思想 希尔排序核心思想在于将待排序数据分成若干组,对每一组数据进行插入排序。这样做好处是,一方面可以减少数据比较次数和移动次数,另一方面可以利用已经部分有序性质,加速排序过程。...随着排序进行,增量逐步减小,直到增量为1,完成最后一次排序。这样设计可以使得排序过程更加高效,因为随着增量减小,每次排序所需要数据交换次数会逐渐减少。...排序步骤 希尔排序排序步骤可以分为以下几个阶段: 分组排序:初始时,根据设定增量将数据分成若干组,对每组数据进行插入排序,使得每组数据都部分有序。...总结 希尔排序基本思想: 先选定一个整数,把待排序文件中所有记录分成个组,所有距离为记录分在同一组内,并对每一组内记录进行排序。然后,取,重复上述分组和排序工作。

5110

排序算法】堆排序

堆与一维数组 建立堆与一维数组联系 堆排序并不是直接对堆节点Node类型排序,而是通过建立索引之间关系,对一维数组排序。...这一关系是由“堆是一个完全二叉树”决定。 堆排序思路就是,在堆根节点与左右孩子之间排序,然后递归地分别对左右孩子对应子树实行相同排序。...如果我们对红框内子树排序完成之后,再对紫框进行排序,那么根节点4左右孩子都将比根节点要大,我们还需要回头对红框进行一次排序。那么第一趟对红框排序就显得很多余。...需要注意是,堆排序仍然是对线性序列排序,我们称这一算法为堆排序,是因为这一过程中,元素索引值之间关系与完全二叉树非常类似。...总结概括 堆排序是对线性序列排序,而不是真的对一个完全二叉树进行排序,用完全二叉树形式解释堆排序过程是出于直观需要。

12420

排序算法 --- 计数排序

前面说那些排序算法,都是要通过比较来实现排序还能不通过比较来实现?是的,计数排序就是这么神奇。 一、排序思想 创建一个计数数组,利用数组下标来表示该元素,用数组下标对应值来表示元素出现次数。...案例: 假如待排序列arr如下: 5 7 4 8 3 5 最大元素是8,所以创建一个最大下标为8数组: int[] count = new int[9]; 遍历待排序列,第一个是...也就是说,当值相同情况下,无法保证排序后相同元素出现顺序和排序前一致,这也就是我们说不稳定排序。如何优化呢?...这样一来,就将计数排序变成稳定了。 3....计数排序缺点: 从上面的分析可以知道,计数排序适合分布比较集中数据,即最大值和最小值相差不多,如果相差特别多,就会很耗费空间。

53021

疯子算法总结(六) 复杂排序算法 ② 桶排序

从《基于比较排序结构总结 》中我们知道:全依赖“比较”操作排序算法时间复杂度一个下界O(N*logN)。但确实存在更快算法。...这些算法并不是不用“比较”操作,也不是想办法将比较操作次数减少到 logN。而是利用对待排数据某些限定性假设 ,来避免绝大多数“比较”操作。桶排序就是这样原理。...(2) 利用先进比较排序算法对每个桶内所有数据进行排序,其时间复杂度为 ∑ O(Ni*logNi) 。其中Ni 为第i个桶数据量。 很显然,第(2)部分是桶排序性能好坏决定因素。...此外,桶排序是稳定。 其实我个人还有一个感受:在查找算法中,基于比较查找算法最好时间复杂度也是O(logN)。比如折半查找、平衡二叉树、红黑树等。...,我们使用了基于单链表直接插入排序算法

45220

排序算法---选择排序

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

65710

排序算法-快速排序

1.快速排序(递归) 快速排序是 Hoare 于 1962 年提出一种二叉树结构交换排序方法,其基本思想为: 任取待排序元素序列中 某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值...cur作用就是和prev拉开距离,然后将大于a[keyi]值放到右边部分,最后交换a[keyi]和a[prev],就完成了部分排序。...,因为插入排序最坏情况就是要插入数都比前面的数小,插入排序在小区间里面比较不错一种排序算法,在快速排序里面使用插入排序可以提高很多效率。...(非递归) 非递归快速排序可以借助一个栈来实现,先入右边值,再入左边值,然后每次取值都是先取栈顶,也就是左边值,然后再进行部分排序,直到返回keyi-1=left,就代表着左边排序完成,右边返回...keyi+1=right,代表右边部分排序完成。

9110

排序算法-选择排序

算法简介 选择排序就是找到数组中最小元素将其和数组第一个元素交换位置,然后在剩下元素中找到最小元素并将其与数组第二个元素进行交换,以此类推,直至整个数组排序结束。...算法描述 找到数组中最小元素并将其和数组第一个元素交换位置 在剩下元素中找到最小元素并将其与数组第二个元素交换,直至整个数组排序 ?...最坏情况:交换 \(n-1\)次,但是每次都要找到最小元素,因此时间复杂度为$ O(n^2) $。 平均情况下时间复杂度为$ O(n^2) $。...由于每次都是选取未排序序列R中最小元素 a 与 R 中第一个元素交换,很可能破坏了元素间相对位置,因此选择排序是不稳定。...排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性 选择排序 \(O(n^2)\) \(O(n^2)\) \(O(n^2)\) \(O(1)\) 不稳定

1.6K40

排序算法-冒泡排序

算法简介 冒泡排序(Bubble Sort)是一种典型交换排序算法,持续比较相邻元素,大挪到后面,因此大会逐步往后挪,故称之为冒泡。 算法描述 比较相邻元素。...冒泡排序排序过程中,元素两两交换时,相同元素前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。...排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性 冒泡排序 \(O(n^2)\) \(O(n)\) \(O(n^2)\) \(O(1)\) 稳定 冒泡排序优化(优化外层循环) 若在某一趟排序中未发现位置交换...为此,在下面给出算法中,引入一个标签flag,在每趟排序开始前,先将其置为false。若排序过程中发生了交换,则将其置为true。...各趟排序结束时检查flag,若未曾发生过交换则终止算法,不再进行下一趟排序

1K70
领券