插入排序

排序算法03:插入排序

别说谁变了你拦得住时间么 提交于 2019-12-06 22:29:58
算法介绍 步骤: 1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3. 如果被扫描的元素(已排序)大于新元素,将该元素后移一位 4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5. 将新元素插入到该位置后 6. 重复步骤2~5 排序演示: 可视化效果: 这里 Javascript实现 /** * Created by YiYing on 2017/4/22. */ ( function (W) { function Insertion (arr) { this .arr = arr; } /** * 插入排序算法实现 */ Insertion.prototype.sort = function () { var len = this .arr.length; for ( var i= 1 ;i<len;i++){ //在已经有序之中,从后往前比对,依次交换,直到插入到正确的位置即可 for ( var j=i;j> 0 && this .less(j,j- 1 );j--){ this .exchange(j,j- 1 ); } } }; /** * 判断m是否小于n * @param m * @param n */ Insertion.prototype.less = function (m,n) { /

基本排序算法:插入排序和选择排序算法的性能比较

巧了我就是萌 提交于 2019-12-06 22:29:20
选择排序: for(int i = 0 ; i < n ; i ++){ // 寻找[i, n)区间里的最小值 int minIndex = i; //记录在区间[i,n)区间内最小值的下标 for( int j = i + 1 ; j < n ; j ++ ) if( arr[j] < arr[minIndex] ) minIndex = j; swap( arr[i] , arr[minIndex] ); //系统内置函数,c++版本不同,有的需要引用<algorithm> } 选择排序对待排序的数组无具体要求,几乎排序完成所用的时间都是一样的。选择排序的缺点是它每一次找出一个元素的正确位置时,都要向后遍历到数组结束才能得出结论,因此很费时间。 插入排序: for( int i = 1 ; i < n ; i ++ ) { for( int j = i ; j > 0 ; j-- ) if( arr[j] < arr[j-1] ) swap( arr[j] , arr[j-1] ); else break; //插入排序是可以提前结束循环的 } 如果用上面的插入排序代码和选择排序比的的话,发现排一个相同的数组,插入排序用的时间反而更多,明明插入排序可以提前结束循环的,不需要像选择排序那样每次都必须从i+1循环到数组的末尾,但时间用的却更多了

排序算法:二分法插入排序

ε祈祈猫儿з 提交于 2019-12-06 22:27:45
二分法插入排序: 在上一篇文章 排序算法:插入排序 中,介绍了插入排序。其中,插入排序的“插入”二字体现于在寻找有序区间[R0,Ri-1]内第一个比Ri小的Rx,然后将Ri插入Rx之后,如果Ri>Ri-1,那正好,Ri不需要再与有序区间的其他元素比较。 二分法插入排序沿用了插入排序的思路,而且由于[R0,Ri-1]是有序序列,在寻找Ri的插入位置时,可以采用二分查找法搜索有序区间中比第一个Ri小的元素,这样就减少了比较次数,提高了插入排序算法的性能。 以长度为6的序列 {6,3,5,4,1,2} 的二分法插入排序过程做示范: 第一趟排序:[3 6] 5 4 1 2 (3插入6之前) 第二趟排序:[3 5 6] 4 1 2 (5插入6之前) 第三趟排序:[3 4 5 6] 1 2 (4插入5之前) 第四趟排序:[1 3 4 5 6] 2 (1插入3之前) 第五趟排序:[1 2 3 4 5 6] (2插入3之前) (注:用中括号括起来的是有序区间,之后的元素序列为待排区间) 可以看见二分法插入的排序过程和插入排序的过程是一摸一样的,但是其中寻找插入位置的过程是不一样的。 用第5趟排序过程作详细介绍第5趟排序过程需要寻找R5,即2的插入位置: 第五趟排序前的序列:[1 3 4 5 6] 2 首先,定义右边界right为R4,值为6,左边界为R0,值为1。[R0,R4]的中间元素为R(4

Python排序算法:插入排序

烈酒焚心 提交于 2019-12-06 22:27:16
什么是插入排序 代码实现 解析 优化插入排序 补小知识点 range()函数 & 和 and 什么是插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法。 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序在实现上,在从后向前的扫描过程中,需要把 已排序元素逐步向后挪位 ,为最新元素提供插入空间。 插入排序动图 : (用MD写的,插入的动图貌似是不会动了。。。。) 从第二位开始,依次和前面的数进行比较,第一位默认已经是有序的了; 第三位和前两位依次比较,第四位和前三位依次比较; 前面的元素均为有序,后面为无序; 即: 先将前两个排序 再将前三个排序 前四个 … 一直到最末尾 代码实现 def insertion_sort (list) : n = len(list) for i in range( 1 ,n): for j in range(i, 0 ,- 1 ): if list[j] < list[j- 1 ]: list[j],list[j- 1 ] = list[j- 1 ],list[j] else : break return list 解析 def insertion_sort (list) : n = len(list) for i in range( 1 ,n): 首先,得到数据的长度后,开始从 1

简单排序算法之插入排序、选择排序和冒泡排序

穿精又带淫゛_ 提交于 2019-12-06 22:27:02
倒也不是临时起意,被问了冒泡排序,我竟然……忘了,好吧,时隔多年重见冒泡,好久不见 甚是想念; 于是乎就写了下代码,顺便重温了两个简单的排序算法:插入排序和选择排序; 作为一个开头,之后有机会就把其它相关排序也总结下,不得不说,真的好生疏/(ㄒoㄒ)/~~ 简单排序算法之插入排序、选择排序和冒泡排序 插入排序: 插入排序是从无序区里依次拿到元素放到有序区里合适的位置; 选择排序; 选择排序是每次将无序区里的最小值放到有序区里的最后一个位置; 冒泡排序; 冒泡排序是每次循环将最大的数“冒泡”到最上边; 有了这几个简单的描述,接下来让我们一个一个来看下; 1.插入排序: 插入排序是从无序区里依次拿到元素放到有序区里合适的位置; 1.1插入排序的理解: 可以将原来的数组看成两个区,分别用两个数组来表示,一个有序区,一个无序区; 有序区起始包含一个元素,即原数组的位置0所对应的元素; 无需区则包含剩余的所有元素; 我们遍历无需区元素,然后与有序区(从末尾位置)逐个进行比较,因为有序区有序,所以当找到满足比较大小的要求时对应的位置,就是元素要插到有序区对应的位置; 为此,我们还需要遍历有序区,好让遍历无序区的元素在有序区中找到合适的位置; 遍历无序区对应算法的外循环; 遍历有序区,比较出无序元素的位置对应内循环; 1.2我们看下具体实现的代码: //插入排序 /*数组 数组长度

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

安稳与你 提交于 2019-12-06 22:26:43
插入排序 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行。 图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入。 代码: #include <stdio.h> void trace( int A[], int N){ int i; for (i= 0 ;i<N;i++){ if (i> 0 ) printf ( " %d" ,A[i]); else printf ( "%d" ,A[i]); } printf ( "\n" ); } void insertionSort( int A[], int N){ int i,j,v; for (i= 1 ;i<N;i++){ v=A[i]; j=i- 1 ; while (j>= 0 &&A[j]>v){ A[j+ 1 ]=A[j]; j--; } A[j+ 1 ]=v; } trace(A,N); } int main(){ int N,i,j; int A[ 100 ]; scanf ( "%d" ,&N); for (i= 0 ;i<N;i++) scanf ( "%d" ,&A[i]); trace(A,N); insertionSort(A,N);

内部排序算法:插入排序

霸气de小男生 提交于 2019-12-06 22:26:23
插入排序算法(insert sorting) 基本思想:把n个待排序的元素看成一个有序表和一个无序表,开始时有序表只包含一个元素,无需表包含n-1个元素,排序的过程 中每次从无序表中取出来第一个元素把它的排序码一次与有序表元素进行比较,将它插入到有序表中适当的位置,使之成为新的有序表。 代码实现方法一:for循环 public void insertNum(int arr[]){ for (int i = 1;i<arr.length;i++){ int insertVal = arr[i]; int index = i-1; for(int j=i;j>0;j--){ if(arr[index]>insertVal){ arr[index+1] = arr[index]; index--; } } arr[index+1] = insertVal; } } 代码实现方法二:while public int[] insertSort(int [] arr){ for (int i =1;i<arr.length;i++){ int insertVal = arr[i]; int index = i-1; while(index>=0&&insertVal<arr[index]){ arr[index+1] = arr[index]; index--; } /

算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)

瘦欲@ 提交于 2019-12-06 22:22:52
引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单。本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现。 一、直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。 算法描述: 步骤1、将待排序的一组记录中的第1个记录拿出来作为一组有序的记录(当然此时该组记录仅有1个记录)。 步骤2、依次将待排序的一组记录中的记录拿出来插入到前面已排好序的记录中。 步骤3、重复步骤2,直到待排序的那组记录中的最后一个记录插入到已排好序的记录中。 举例: 直接插入排序如下一组记录:49、38、65、97、76、13、27、49。 步骤1:选出待排序的这组记录中的第一个记录作为有序记录,得到有序记录和无序记录如下 有序记录:{49} 无序记录:{38、65、97、76、13、27、49} 步骤2:选出无序记录中的第一个记录38插入到有序记录{49}中,得到新的有序记录和无序记录如下 有序记录:{38、49} 无序记录:{65、97、76、13、27、49} 步骤3:重复步骤2,每插入一个记录,得到一组新的有序记录和无序记录如下 有序记录:{38、49、65} 无序记录:{97、76、13、27、49} 有序记录:{38、49、65、97} 无序记录:{76

经典排序算法:插入排序

六眼飞鱼酱① 提交于 2019-12-06 22:20:38
插入排序 插入排序 (Insertion Sort)顾名思义就是讲未排序的元素插入到已排序的队列中以构成新的有序队列。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 原理 每次都将当前元素插入到左侧已经排序的数组中,使得插入之后左侧数组依然有序,如图: 代码实现 Java实现: public static void insSort ( int arr [ ] ) { // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的 for ( int i = 1 ; i < arr . length ; i ++ ) { // 记录要插入的数据 int temp = arr [ i ] ; int indx = 0 ; // 从已经排序的序列最右边的开始比较,找到比其小的数 for ( int j = i ; j > 0 ; j -- ) { if ( arr [ j ] < arr [ j - 1 ] ) { arr [ j ] = arr [ j - 1 ] ; indx = j - 1 ; } else { break ; } arr [ indx ] = temp ; } // //定义要插入的元素 // int insertValue = arr[i]; // /

插入排序算法,就这么简单

被刻印的时光 ゝ 提交于 2019-12-06 15:11:38
一、前言 什么是算法?算法是某种集合,是简单指令的集合,是被指定的简单指令集合。确定该算法重要的指标: 第一是否能解决问题; 第二算法运行时间,即解决问题出结果需要多少时间; 还有所需的空间资源,比如内存等。 很多时候,写一个工作程序并不够。因为遇到大数据下,运行时间就是一个重要的问题。 算法性能用大 O 标记法表示。大 O 标记法是标记相对增长率,精度是粗糙的。比如 2N 和 3N + 2 ,都是 O(N)。也就是常说的线性增长,还有常说的指数增长等 典型的增长率 典型的提供性能做法是分治法,即分支 divide and conquer 策略: 将问题分成两个大致相等的子问题,递归地对它们求解,这是分的部分; 治阶段将两个子问题的解修补到一起,并可能再做些少量的附加工作,最后得到整个问题的解。 二、排序 排序问题,是古老,但一直流行的问题。从 ACM 接触到现在工作,每次涉及算法,或品读 JDK 源码中一些算法,经常会有排序的算法出现。 排序算法是为了将一组数组(或序列)重新排列,排列后数据符合从大到小(或从小到大)的次序。这样数据从无序到有序,会有什么好处? 应用层面:解决问题。 最简单的是可以找到最大值或者最小值 解决"一起性"问题,即相同标志元素连在一起 匹配在两个或者更多个文件中的项目 通过键码值查找信息 系统层面:减少系统的熵值,增加系统的有序度 (Donald