
排序算法
何小黑~
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
选择排序算法
public class Test{ public static void selectionSort(int []arr) { for(int i=0;i<arr.length;i++) { int small_index=i; //small_index为最小值的下标 for(int j=i+1;j<arr.l原创 2018-09-04 17:28:28 · 159 阅读 · 0 评论 -
桶排序、计数排序、基数排序
1、桶排序、计数排序、基数排序不是基于比较的排序,与被排序的样本的实际数据状况很有关系,所以实际中并不经常使用。 2、时间复杂度O(N),额外空间复杂度O(N) 3、稳定的排序 例子:给你一个数组,数组中的所有数的范围是0~60的,把这个数组排好序。 做法:生成一个长度为61的(词频)数组,初始化数组为{0,0,…,0}。然后遍历原数组,遇到一个数的时候,在该数对应词频数组下标的位置++,表示词频...原创 2019-06-20 19:53:51 · 301 阅读 · 0 评论 -
排序问题的补充
1、归并排序的额外空间复杂度可以变为O(1),但是非常难,不需要掌握。可以搜**“归并排序 内部缓存法”**。如果这么改的话,归并排序会被改的面目全非。。 网上有的帖子说"原地归并排序"可以将额外空间的复杂度变为O(1),但同时,其时间复杂度就变为了O(N2)。有病吧。。。何必为了减空间让时间复杂度退变成O(N2)呢。。。 2、快速排序可以做到稳定排序,但是非常难,不需要掌握,可以搜**“01 s...原创 2019-06-20 15:18:13 · 393 阅读 · 0 评论 -
稳定和不稳定排序
稳定的排序算法:直接插入排序、冒泡排序、归并排序 不稳定的排序算法:希尔排序、快速排序、简单选择排序、堆排序 Q:为什么直接插入排序稳定? A:因为每加入一个新的数都要把它和前面排好序的最后一位对比,比它大则直接放后面;比它小则往前插入;如果遇到相等的,就不往前插了,直接放后面,这样可以确保相同值相对顺序不变。因此是稳定的。 Q:为什么冒泡排序稳定? A:每一次的比较都是前一个数与后一个数比较,如...原创 2019-06-20 14:35:24 · 5597 阅读 · 0 评论 -
综合排序总结
如果给你一个数组,长度很长,综合排序会先进行一个判断,判断数组里面放的数据类型是什么样的,是基础类型(int,double,char,float,short)还是你自定义的类型(student)。 如果装的是基础类型的数据,则会用快排(不稳定); 原因是:基础类型根本不用区分原始顺序,相同值无差异。 如果数据的类型是你自己定义的(student)类型,则会用归并排序(稳定)。 原因是:对一个班级,...原创 2019-06-20 13:53:55 · 3706 阅读 · 0 评论 -
堆排序(很重要!!!!!!)
其实完全二叉树只是人们脑子里抽象出来的一种数据结构,实际情况下,我们是利用数组+一个限定规则来实现二叉树的结构的。 限定规则是:下标为i的数组元素是下标为2i+1与下标为2i+2的父节点,且下标为i的数组元素的父节点的数组下标为(i-1)/2。 构建大顶堆的思路:给我一个数组arr,这个数组一次把i位置上的数加进来,让它0~i位置上的数形成大顶堆。(大致过程就是:新加入的数字与其父节点的大小进行比...原创 2019-06-19 14:33:48 · 295 阅读 · 0 评论 -
希尔排序
思想:希尔排序也称为“缩小增量排序”,基本原理如下:先将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别进行直接插入排序,待整个排序序列“基本有序后”,最后再对所有元素进行一次直接插入排序。 public class Test{ public static void sort(int[] arr){ if(arr == null || arr...原创 2019-06-12 22:12:52 · 139 阅读 · 0 评论 -
直接插入排序
基本思想:把n个待排序的元素看成是一个有序表和一个无序表,开始的时候,有序表中只有一个元素(待排序数组的首个元素),无序表中有n-1个元素;排序过程就是每次从无序表中取第一个元素,插入有序表中,通过比较大小重排序,使之成为新的有序表,重复n-1次完成整个排序过程。 public class Test { public static void insertSort(int[] arr) { ...原创 2019-06-12 16:51:30 · 265 阅读 · 0 评论 -
归并排序
思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。 public class Test { private static void merge(int[] arr...原创 2018-09-13 21:05:22 · 147 阅读 · 0 评论 -
冒泡排序
思想:依次比较相邻的两个数,将小数放在前面,大数放在后面。 即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。 然后比较第2个数和第3个数,将小数放前,大数放后。 如此继续,直至比较最后两个数,将小数放前,大数放后。 重复第一趟步骤,直至全部排序完成。 规律:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内...原创 2018-09-12 20:45:18 · 1130 阅读 · 0 评论 -
快速排序算法(挖坑法+左右指针法+快慢指针法)
快速排序(分而治之法)(挖坑法) 挖坑法,可以理解成拆东墙补西墙。这里以数组[4,1,7,6,9,2,8,0,3,5]为例子讲解。以数据第一个元素作为枢轴(也可以是是最后一个,因看你喜好)。这里我们先把作为枢轴的4抠出来单独放置,此时数组变成了[口,1,7,6,9,2,8,0,3,5]的形式。 这时我们要从数组尾部开始往前找,找第一个比4小的数字,5比4大,j - -,这时3比4小,把3放在坑...原创 2018-09-11 19:59:28 · 2760 阅读 · 3 评论 -
二分查找算法
仅当列表是有序时候,二分查找才管用。 代码块 public class Test{ public static int binary_search(int []arr,int key) { int low=0; int high=arr.length-1; while(low<=high) { int...原创 2019-09-25 22:03:18 · 144 阅读 · 0 评论 -
二分排序算法
根据排序原则,每次我们都是在一个有序序列中插入一个新的数字 那么我们可以将这个有序序列进行二分。 左游标left为0,右游标right为i-1(i是这个数字在原数组中的位置) middle初始为0。 当left<=right时 middle是left和right的中值。 我们作如下操作。如果array[i]的值比array[middle]值大。 那么我们就移动左游标为middle+1 否则...原创 2019-08-21 16:17:44 · 276 阅读 · 0 评论