插入排序

算法之插入排序

两盒软妹~` 提交于 2019-11-28 00:42:18
插入排序 插入排序也是一个很常见的排序,大家很多都以扑克牌作为例子,非常的形象。我们打牌的时候, 从第一张牌开始,它就是有序的; 第二张牌我们排序后放到第一张的左侧或者右侧; 每来一张牌就都会排序好,直至所有的牌 插入排序的实现流程 1.外循环N-1次,从第一张牌开始就是有序的,从i=1开始外循环 2.内循环从第i张牌开始,保证i张牌加入是有序的,i张牌递减比较 3.每一次插入都保证了前面的数组是有序的 代码实现 package com.java.arlgorithm.sort; import lombok.extern.slf4j.Slf4j; import java.util.Arrays; /** * @author */ @Slf4j public class InsertSortTest { public static void main(String[] args) { int[] array = new int[]{5, 6, 4, 3, 1, 6}; //int[] arrayOptmize = new int[]{1, 2, 3, 4, 5, 6}; inserSort(array); } public static void inserSort(int[] array) { int len = array.length; for (int i = 1; i <

插入排序

五迷三道 提交于 2019-11-28 00:04:07
void insertsort(int a[],int size) { int i; for(int i=0;i<size-1;i++) { int tmp=a[i+1]; int j=i; while (j>=0&&tmp<a[j]) { a[j+1]=a[j]; j--; } a[j+1]=tmp; } } 来源: https://www.cnblogs.com/zuiaimiusi/p/11381716.html

排序算法之插入排序(直接插入方式)

試著忘記壹切 提交于 2019-11-27 20:56:45
插入排序基本思想:   插入排序,就是把一组乱序的数据,依次拿出一个,放入到一组已经排好序的数据中的正确的位置。又可以分为:①直接插入排序、②折半插入排序、③二路插入排序、④表插入排序、⑤希尔排序 一、 直接插入排序   1.基本思想:相对比较简单的一种排序方法,就是按照概念一步一步的操作,可以使用for循环实现         假设按照从小到大的顺序排序(1)从第二个数据(下标为1的数据)开始,一直到最后一个数据结束,每次取出一个数据。(2)比较第一步的数据和它前一个位置的数据,如果大于前一个位置的数据, 则交换两者。再开始和前面的数据依次比较,并和比它大的数据进行交换,因为前面的数据已经有序,则找到第一个比它小的数据后就退出。 2.直接插入排序过程: 3.java代码: public int[] insertionSort(int[] array){ for(int i = 0;i < array.length - 1;i++){ for(int j = i + 1; j > 0;j--){ if(array[j] < array[j - 1]){ array[j] = array[j] ^ array[j - 1]; array[j - 1] = array[j] ^ array[j -1]; array[j] = array[j] ^ array[j - 1]; }else

20182311 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结

≡放荡痞女 提交于 2019-11-27 16:58:20
目录 教材学习内容总结 教材第13章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 结对及互评 点评过的同学博客和代码 感悟 学习进度条 参考链接 正文 20182311 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 教材第13章 查找 线性查找:改进方法:设立哨兵,即将数组下标为0的内容设定为需要查找的数字,这样可以减少每次循环都对下标与最大值的比较,优化算法。 折半查找:时间复杂度为O(log2n),效率高,但只能用于有序线性存储结构。 哈希表查找:使用mod算法来实现数据的快速存取 冲突:两个不同关键字对应同一个内存地址 开放地址法:线性探测再散列,若关键字对应地址非空,向后移位直到找到空地址存入,查找步骤与之相同。 链地址法:将存储空间定义为链表数组,每一个存储空间都代表一个链表的表头,若出现冲突,直接延长链表的长度,查找顺序与存入顺序相同。 二叉排序树:通过在各个岔路口分流实现数据的排序。在实现过程中我使用了类似双向链表的数据结构,不过链表的两头只用来向下指左右子树,所以做出来的二叉树只能单向的读取数据,不能实现真正的“双向”。 排序 衡量排序算法是否稳定的标准:相同元素排序后先后次序是否发生变化, 插入排序:利用双重循环和插入,逐渐将整个表从前向后实现有序排列。 折半插入排序:对插入排序的改良

插入排序

时间秒杀一切 提交于 2019-11-27 16:20:29
插入排序: 算法思想:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 举例: 8 6 2 3 1 5 7 4 第一个与元素默认为排序好的,i 的范围 (i=1...n-1) j 每次表示当前元素,j 的初始值为i,依次向前比较,是否比前一个数小,小的话,插入,否则不动。 第一次 i = 1,j = 1 6 和 8 比较 ,6比8小,将8后移, 6 填补上去 此时 6 8 2 3 1 5 7 4 第二次 i = 2, j = 2 2和 8比较,2比8小,8后移,此时为 6 8 8 3 1 5 7 4, j-1, 8比 6 大,不变,此时将2 填补上去。 6 2 8 3 1 5 7 4 第三次 i = 3,j =3 3 和 8比较 ,3比8 小 8后移 ,此时为 6 2 8 8 1 5 7 4 j-1 ,8比2 大 ,不变 ,此时再将3填补上去, 6 2 3 8 1 5 7 4. 以此类推 public void insertSort(Comparable[] arr){ int n = arr.length; //默认第一个元素是已经拍好的 for (int i = 1; i <n;i++) { //当前要考察的元素,是不是比他前面小,在插入, 当前位置 //写法一 /* for (int j = i;j >0;j--) { if(

排序——插入排序的优化:折半(二分)插入排序

女生的网名这么多〃 提交于 2019-11-27 15:59:18
折半插入排序(Binary Insertion Sort),也叫二分插入排序,是直接插入排序的一种改进,关于直接插入排序,可以点击 【传送门】排序——直接插入排序 查看,这里主要总结一下折半插入排序。 折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 以一个大小为n的数组arr为例,折半插入排序的基本思路为: 将未排序数组可以看做已排序区间[0,i-1]和未排序区间[i,n-1],同时定义已排序区间首尾分别为:low= 0,high= i-1;(第一次插入时默认第一个元素arr[0]为有序区间,此时low,high都为0,i为1) 我们需要将未排序区间的元素依次取出来插入到已排序区间的正确位置,这时,我们可以将已排序区间也看做由[0,mid]和[mid+1,i-1]两部分组成,mid是已排序区间的中间元素的位置; 从未排序区间第一个元素开始,如果发现要插入的第一个元素arr[i]大于已排序区间mid位置的元素,即mid位置之前的元素全部小于待插入元素,待插入元素必然在mid之后,所以更新low = mid+1; 若要插入的第一个元素arr[i]小于或等于已排序区间mid位置的元素,待插入元素必然在mid之前,所以更新high = mid-1; 直到low大于或等与high时,此时high位置之前的元素小于待插入元素且有序,插入只改变high位置之后的元素;

Java八大排序之希尔(Shell)排序

≡放荡痞女 提交于 2019-11-27 15:31:05
希尔排序 (Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。 Shell插入排序的具体做法是:对有n个记录进行排序,首先取1个整数d<n,将这n个记录分成d组,所有位置相差为d的倍数的记录分在同一组,在每组中使用直接插入排序进行组内排序,然后缩小d的值,重复进行分组和组内排序,一直到d=1结束。 执行过程图: 代码: 1 public class TestShell { 2 //插入排序 3 public static void shellSort(int[] arrays){ 4 int d,j,temp; 5 d = arrays.length/2; 6 //增量大于等于1 7 while(d>=1){ 8 //从第d个元素开始,将所有元素有序插入相应分组中 9 for (int i = d; i < arrays.length; i++){ 10 temp = arrays[i]; //保存第i个元素 11 j = i - d; //向前找插入位置 12 while(j>=0 && temp < arrays[j]){ //排序码比较找插入位置并后移 13 arrays[j+d] =

Java八大排序之插入排序

最后都变了- 提交于 2019-11-27 15:01:32
插入排序 也可叫直接插入排序,该算法的思路是:初始可认为文件中的第1个记录已排好序,然后将第2个到第n个记录依次插入到已排序的记录组成的文件中。 步骤: 假设有一组数组为(数组下标0—n-1): arrays={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1}; 一,从下标为1的数据(当前数据)开始遍历,而且之后往后移直到下标为n-1(数组的最后一位下标数据);二,定义一个变量并保存当前数据;三,当前数据与前面数据依次对比直到前面数据的下标为0,如果大于当前数据,则把前面的数据往右移一位;四,每执行第三步后,将之前保存当前数据的变量赋值为给前面数据的下标加1. 流程图: 代码: 1 public class TestInsert { 2 //直接插入排序 3 public static void insertSort(int[] arrays){ 4 int i,j; 5 //从第二位开始遍历,(之后把第i位数据叫作当前数据) 6 for (i = 1; i <arrays.length; i++){ 7 //保存当前数据为temp 8 int temp = arrays[i]; 9 j = i - 1; //把 j 赋值为 i 的前一个数据 10 //循环,如果j大于等于0 且 第j个数据大于当前数据 11 while (j >=

排序算法--希尔排序

江枫思渺然 提交于 2019-11-27 14:15:24
备忘一下希尔排序。 原理: 希尔排序是插入排序的变种。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。 借用百度百科的一段话,之所以希尔排序优于插入排序,原因是,当n值很大时数据项每一趟排序需要的个数很少,但数据项的距离很长。当n值减小时每一趟需要动的数据增多,此时已经接近于它们排序后的最终位置。 正是这两种情况的结合才使希尔排序效率比插入排序高很多。 分析: 至于稳定性,单个插入能保证稳定性,但是多组插入就不能保证组之间的稳定性了,所以它是不稳定的。时间复杂度方面, 好多 资料认为希尔排序时间复杂度会比o(n^2)好一些。空间方面,它是原地的。 代码展示 :我在这里使用的步长d初始为数组的长度的一半,然后不停减半直到1。 public class ShellSort { public static void main(String[] args){ int[] target = {49,38,65,97,76,13,27,49,78,34,12,64,1}; new ShellSort().shell_sort(target); System.out.print("Result:"+" "); for(int k : target)

插入排序

非 Y 不嫁゛ 提交于 2019-11-27 14:14:44
插入排序   插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表。      比如,待排序列表为[49,38,65,97,76,13,27,49],则比较的步骤和得到的新列表如下:(带有背景颜色的列表段是已经排序好的,红色背景标记的是执行插入并且进行过交换的元素)    1 """ 2 插入排序:选择列表中的未排序的子元素与前边已经排好顺序列表元素进行比较; 3 (1)方式一:从前往后比较 4 如果当前元素比前边排序元素值小,则从该位置将排好序的元素往后移动一位,再将当前元素插入! 5 注意:向后移动时的从后往前!!! 6 (2)方式二:从后往前 7 如果当前元素比前边排序元素最后一个值小,则交换位置,然后继续与前一个比较,如果小则交换,直到最前边没有元素! 8 """ 9 10 11 # 方式一:对已排好顺序的元素,从前往后比较 12 def insert_sort(int_list): 13 length = len(int_list) 14 if length <= 1: return int_list 15 for i in range(1, length): 16 item = int_list[i] 17 for j in range(i): 18 if item < int_list[j]