插入排序

经典排序算法 – 插入排序Insertion sort

大城市里の小女人 提交于 2020-03-21 07:41:01
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个 待排数据 按其大小插入到 已经排序的数据中 的适当位置,直到全部插入完毕。 插入排序方法分 直接插入排序 和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。 入。 源码如下: (1) (2) 设数组为a[0…n-1]。 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。 3. i++并重复第二步直到i==n-1。排序完成。 源码如下: (3) 这样的代码太长了,不够清晰。现在进行一下改写,将搜索和数据后移这二个步骤合并。 即每次a[i]先和前面一个数据a[i-1]比较,如果a[i] > a[i-1]说明a[0…i]也是有序的,无须调整。 否则就令j=i-1,temp=a[i]。然后一边将数据a[j]向后移动一边向前搜索,当有数据a[j]<a[i]时停止并将temp放到a[j + 1]处。 源码如下: (4) 源码如下: 来源: https://www.cnblogs.com/chengbao/p/4859358.html

算法——选择排序、插入排序和希尔排序(改进的插入排序)

爷,独闯天下 提交于 2020-03-21 00:44:54
3 月,跳不动了?>>> 选择排序 首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此以往,直到 将整个数组排序。 性能 :算法的时间效率取决于比较的次数。对于长度为N的数组,选择排序需要大约N²/2次比较和N次交换。 特点 :1. 运行时间和输入无关 :比如即使输入一个有序的数列,还是会和随机数列一样,进行比较、交换处理。 2. 数据移动是最少的 :共N次交换,即交换次数和数组大小是线性关系。其他任何算法都不具备这个特征,大部分都是线性对数或是平方级别的。 函数实现如下: public class Selection { public static void sort(Comparable[] a) { //将a[]按升序排列 int N=a.length; for(int i=0;i<N;i++) { int min=i; for(int j=i+1;j<N;j++) { if(less(a[j],a[min]))min=j; } exch(a,i,min); } } } 插入排序 就像通常人们整理桥牌的方法一样,一张一张来,将每一张牌插入到其他已经有序的牌中的适当的位置。 在计算机中的实现中,为了给要插入的元素腾出空间

插入排序

孤街醉人 提交于 2020-03-20 23:54:08
3 月,跳不动了?>>> 1、思想 将数组元素想象成玩扑克时拿牌顺序,首先当有一个元素,没啥处理;然后第二个元素,和第一个比较,找到适合的位置插入;然后第三个元素找到适合位置,原本在该位置以后的所有元素往后移一位,再插入。循环反复,形成有序序列。 2、时间复杂度 最好 O(n) ,最坏 O(n^2) ,平均 O(n^2)。 3、代码实现 public class InsertSort { public static void insertSort(int[] arr){ if(arr.length == 0 || arr == null) return ; int n = arr.length; for(int i=1;i<n;i++){ int temp = arr[i]; int move = i-1; while(move >=0 && arr[move] >temp){ arr[move+1] = arr[move]; move--; } arr[move+1] = temp; } } public static void main(String[] args){ int[] arr = {50,10,90,30,70,40,80,60,20}; insertSort(arr); for (int array : arr) { System.out.print(array+

插入排序和归并排序

眉间皱痕 提交于 2020-03-19 06:57:46
插入排序思想:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使这n个数也是排好顺序的。如此反复循环,直到全部排好顺序.(当待排序数据全部有序时,时间复杂度为O(N),最坏情况下时间复杂度为O(N*N),与待排序数据的状态有关). public class InsertSort { public static void insertSort(int[] arr) { if(arr == null || arr.length < 2) return ; for(int i = 1; i < arr.length; i++) { for(int j = i -1; j >= 0 && arr[j] > arr[j+1]; j--) swap(arr, j , j+1); } } public static void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] arr = new int[] {3,434,24,656,57,54,88,66}; System.out.print("原始数组:"); for(int i = 0; i <

数据结构与算法9-排序1

北城余情 提交于 2020-03-17 22:39:49
本篇文章讲解冒泡、插入、选择排序。 1.衡量排序算法执行效率(不太用的到) 时间复杂度 时间复杂度的系数、常数、低阶 比较次数和交换(或移动)次数 2.一些前提概念 上述使用稳定排序算法的例子蛮实用的。 3.冒泡排序 平均时间复杂度呢?—— 使用有序度、逆序度 满有序度 = n*(n-1)/2 逆序度 = 满有序度 - 有序度 最坏情况的逆序度是 n*(n-1)/2,所以算平均是 n*(n-1)/4,所以平均时间复杂度为O(n^2)。 4.插入排序(就是打扑克牌,所以很常用) 上述关于逆序度的trick,了解一下即可。 5.选择排序(就是选苹果) 6.为什么插入排序更受欢迎 7.小结 8.扩展 冒泡排序 动图:https://pic1.zhimg.com/v2-1543c0b97237bb55063e033959706ca0_b.webp 插入排序 动图:https://pic2.zhimg.com/v2-f87ad7d8ad54379dd81f02fcf9b91f49_b.webp 选择排序 动图:https://pic1.zhimg.com/v2-f20b8898585b3ca03843d93ce2c35a68_b.webp 来源: CSDN 作者: Xu_Wave 链接: https://blog.csdn.net/qq_22795223/article/details

JAVA学习之插入排序算法

假装没事ソ 提交于 2020-03-17 18:51:13
插入排序 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序在实现上,通常采用in-place排序(原地排序,即只需用到O(1)的额外空间的排序), 因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 算法描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 如有这么一个数列 int[] arrs=new int[]{1,3,4,5,2}; 先取出2并临时存储,与它前一位对比 arrs[3]=5和2比较,5大于2,5后移到arrs[4],此时arrs[3]和arrs[4]都是5 从后往前移动到arrs[2] arrs[2]=4和2比较,4大于2,4后移到arrs[3],此时arrs[2]和arrs[3]都是4 从后往前移动到arrs[1] arrs[1]=3和2比较,3大于2,3后移到arrs[2],此时arrs[1]和arrs[2]都是3 从后往前移动到arrs[0] arrs[0]=1和2比较,1小于2

java基础算法之插入排序

孤者浪人 提交于 2020-03-17 18:50:14
一、插入排序介绍   插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 时间复杂度:O(n^2);   算法描述:   1.排序从第二个元素开始,第一个元素默认为有序的。   2.取出下一个元素(第一次取第二个,后面依次类推),在已经排序的元素序列(默认的是第一个元素)中从后向前扫描   3.如果该元素(已排序)大于新元素,将该元素移到下一位置   4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置   5.将新元素插入到该位置后   6.重复步骤2~5 二、插入排序实现 package com.roc.insertsort; /** * 直接插入排序 * @author liaowp * */ public class InsertSort { public static void main(String[] args) { int[] arr={5,7,3,9,1}; InsertSort.sort(arr); System.out.print("排序结果:"); for (int i =

基础算法之插入排序Insertion Sort

早过忘川 提交于 2020-03-17 18:22:17
原理 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。相信大家都打过扑克牌,很好理解。 例子 将数组[5,6,3,1,8,7,2,4]进行从小到大排序 排序步骤: 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 动画演示 代码参考      static void Main(string[] args) { int[] intArray = { 3, 6, 4, 2, 5, 1 }; Insertion_Sort(intArray); foreach (var item in intArray) { Console.WriteLine(item); } Console.ReadLine(); } static void Insertion_Sort(int[] unsorted) { int i, j, temp; for (i = 1; i < unsorted.Length; i++) { //

排序算法总结(一)插入排序【Insertion Sort】

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-17 18:21:45
最近在忙着找工作,以前看的排序算法都忘记了,悲剧啦T T现在来回顾一下吧。 这边推荐一个算法可视化的网站,非常有用。http://visualgo.net/ 一.插入排序的思想(Wikipedia):   它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 从第一个元素开始,该元素可以认为已经被排序 取出下一个元素,在已经排序的元素序列中从后向前扫描 如果该元素(已排序)大于新元素,将该元素移到下一位置 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 将新元素插入到该位置后 重复步骤2~5 Tips:如果 比较操作 的代价比 交换操作 大的话,可以采用二分查找来减少 比较操作 的数目。该算法可以认为是 插入排序 的一个变种,称为二分查找插入排序。 二:过程 原始数据 如下图所示,第一个数设为已排序完成的数,此时将需要排序的数往前进行比较,如果已排序的数(11)大于改元素(5),则将已排序的数后移一位(11),直到找到比自己(5)小的数或则到达数组的头部。 重复上述过程 三.代码 #include <iostream> #include <vector>

排序系列之插入排序

孤街浪徒 提交于 2020-03-17 18:21:18
插入排序 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。 插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 分 类 :直接插入排序,二分插入排序 直接插入排序 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。 描述 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描 ⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置 ⒋ 重复步骤3