排序算法
排序算法
beConcentration
这个作者很懒,什么都没留下…
展开
-
排序算法-基数排序20220413
基数排序偏向于实际业务场景使用,一般适用于字符串排序或者手机号等排序,其中字符串排序使用了ascII码作为依据,基数排序思想是逐位进行计数排序,最终得到有序的数组;一般业务来讲,我们希望的顺序是第一位字符/数字优先有序,在第一位有序的情况下再要求第二位、第三位…有序,想做到这个需求,需要我们从低位优先进行排序,一些特殊业务也可以考虑从高位优先进行排序。 而更多的时候,字符串是参差不齐的,那在排序的时候,我们可以对短的字符串,在末位补0让它和最长的一样长就可以比较了。 基数排序代码如下: public cla原创 2022-04-13 11:49:19 · 414 阅读 · 0 评论 -
排序算法-归并排序20220413
归并排序的思想是,无限向下折半拆分,将待排序的无序数组拆分成俩俩一组的多个小数组,就像二叉树的结构一样,然后将每个小数组进行组内排序,排序完成后,再按之前拆分的层级再逐层合并后排序,最终合并出一个有序数组,比如一个长度为8的数组操作步骤:1->2->4->8->4->合并后排序->2->合并后排序->1->合并后排序。 代码及代码解释如下: public static void mergeSort(int[] array, int start,原创 2022-04-13 10:16:31 · 990 阅读 · 0 评论 -
排序算法-希尔排序20220412
希尔排序的思想是,在拿到无序数组后,我们首先对这个数组进行一个粗略的排序,让整个数组没那么无序之后,再进行插入排序,是对插入排序的一个优化升级。 而怎样确定这个粗略的排序有多粗呢,这涉及到一个增量序列的概念,我们要根据增量序列逐次将数组分成多个小的无序数组,然后将每个小的无序数组通过插入排序进行有序化,最终跨度为1将对这个初步有序数组进行最后的插入排序。 增量序列默认为shell增量每次增量折半,比如8,4,2,1,而后期的优化中比较出名的有:Hibbard增量和 Sedgewick增量等,这个不在排序的范原创 2022-04-12 19:20:04 · 433 阅读 · 0 评论 -
排序算法-插入排序20220412
插入排序算法有点像扑克牌的排序,其思想是从头依次将每一个元素放到有序的地方,也就是每拿出来一个元素,将它和它前面排过序的元素挨个比较一下,然后将它插入到那个比前一个比它小,后一个比它大的地方,当所有元素都这么操作一遍之后,无序的数组就变成了一个有序的数组。 直接插入: public static void straightInsertSort(int[] arr) { for (int i = 0; i < arr.length; i++) { int temp = arr[i];原创 2022-04-12 15:40:09 · 196 阅读 · 0 评论 -
排序算法-选择排序20220411
选择排序很直白,它的思路是循环的每一圈找到剩下没排序的数组里的最小/最大值(看你想从小到大还是从大到小了),然后将它直接和剩下的这些个元素的第一个元素交换,最终得到有序数组。 选择排序代码如下: public static void selectionSort(int[] array) { for (int i = 0; i < array.length - 1; i++) { int minIndex = i; for (int j = i + 1; j < array.le原创 2022-04-11 22:19:02 · 69 阅读 · 0 评论 -
排序算法-桶排序20220411
桶排序思想和计数排序比较相似,不同的是桶排序支持小数排序,为了支持小数排序,桶排序在操作的时候,为待排序数组构建一个List,而这个List的每个元素又是一个List,这每个List元素各自管理一段数值区间,当进行桶排序的时候,遍历待排序数组,将每个数放到对应的数值区间中,就像丢到不同的桶里一样,最后再对每个桶进行内部排序,最后遍历整个List,最终得到排序数组。 首先需要知道每个区间跨度多少合适,使用公式(最大值 - 最小值)/(桶数量 - 1)计算,这里桶数量等于待排序数组元素个数。 而每个元素应该放到原创 2022-04-11 21:11:48 · 177 阅读 · 0 评论 -
排序算法-计数排序20220314
计数排序思想是将数值作为角标,统计每个角标有几个这样的数,最后循环取出则是一个有序数组。 超基础版:取到这个arr数组最大值,然后根据最大值创建一个新数组,循环arr将arr数值对应新数组的角标计数。最后循环得到有序arr。 public static void countSort(int[] arr) { int max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i原创 2022-03-22 19:59:55 · 117 阅读 · 0 评论 -
排序算法-堆排序20220314
学习堆排序必须搞明白堆这个数据结构!!! 排序思路: 首先将待排序数组构建成最大堆,然后逐一将root放到末尾,堆的特性会将其第而大的数作为最大数上浮成root,最终产生有序数组。 代码: import java.util.Arrays; /** * 堆排序 * * @author DepengZhang * @date 2021年07月30日 20:01 */ public class HeapSort { /** * 下沉调整 * * @param array 待原创 2022-03-14 18:36:45 · 831 阅读 · 0 评论 -
排序算法-快速排序20220309
基于冒泡排序的部分思路,我们可以取一个分界值,将小于它的数放它的左边,把大于它的数放它的右边,然后以这个分界值为界限,拆分出两个新的待排序的数组,继续这一步骤,这就是快速排序,而这个步骤叫分治法。 而移动方式有两种,一种是单边的,一种是双边的,我们默认取第一个数为分界值。 单边 单边循环步骤是首先选中分界值。并记录其角标,然后对除了分界值外的数组进行for循环, ...原创 2022-03-10 10:41:10 · 95 阅读 · 0 评论 -
排序算法-冒泡排序20220301
先以最简单的冒泡排序做为开始。 1.1 基本写法 每次取一个数,将它和前面每一个数进行比较,如果比前面的数小,就互换,就像泡泡一样飞到水面 public static void bubbleSort(int[] array) { for (int i = 1; i < array.length; i++) { for (int j = i; j > 0; j--) { if (array[j] < array[原创 2022-03-01 20:54:26 · 62 阅读 · 0 评论