插入排序

排序算法三:插入排序

孤者浪人 提交于 2020-02-27 19:28:15
//把每个值,插入到适合他的位置。插入的方法是:它前面的值往后移动。这个算法需要下标为0的位置作为哨兵#include <stdio.h> void InsertSort(int *L) { int i, j; for (i = 2; i < 11; i++) { if (L[i] < L[i - 1]) { L[0] = L[i]; for (j = i - 1; L[j] > L[0]; j--) { L[j + 1] = L[j]; } L[j + 1] = L[0]; //因为循环最后的j--了 } } } int main() { int L[11] = { -1,3,2,5,6,8,1,9,4,7,0 }; int i = 1; for (; i <= 10; i++) { printf("%d ", L[i]); } printf("\n"); InsertSort(L); for (i = 1; i <= 10; i++) { printf("%d ", L[i]); } printf("\n"); return 0; }    来源: https://www.cnblogs.com/miracle2015126/p/6118914.html

排序算法(三)插入排序

送分小仙女□ 提交于 2020-02-27 19:27:32
1,算法描述 算法描述: 对于未排序数据(右手抓到的牌),在已排序序列(左手已经排好序的手牌)中从后向前扫描,找到相应位置并插入。 插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 2,实现步骤 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。    1)常规实现 1    /** 2 * 最差时间复杂度 ---- 最坏情况为输入序列是降序排列的,此时时间复杂度O(n^2) 3 * 最优时间复杂度 ---- 最好情况为输入序列是升序排列的,此时时间复杂度O(n) 4 * 平均时间复杂度 ---- O(n^2) 5 * 所需辅助空间 ------ O(1) 6 * 稳定性 ------------ 稳定 7 */ 8 private static void insertionSort1(int[] a) { 9 long start = System.nanoTime(); 10 int len = a.length; 11 for (int i = 1;

【算法】排序(三)插入排序

帅比萌擦擦* 提交于 2020-02-27 19:27:14
上次给大家说了说简单的冒泡排序,这次我们来说一说插入排序 插入排序的做法就像是我们日常生活中玩扑克牌一样,每次抽一张牌,将扑克牌按一定顺序插入手牌中,一步步完成排序 本文将介绍以下内容 排序思想 算法实现(JAVA) 测试阶段 排序过程讲解 算法分析 排序思想 插入排序同样有内循环和外循环,外循环执行n - 1次,内循环负责比较相邻两个数的大小并交换(如果需要)。每次将未排序序列里的第一个数与后一个数比较,如果后者小,就交换二者的位置,并和以排序的序列元素依次比较并交换(如果需要)。 就如同玩扑克牌,每次抽取的一张牌都要与所有手牌一对一比较,并确定最终插入的位置。 算法实现 1. 外循环 public static void insertionSort(int[] a) { int n = a.length; for (int i = 1; i < n; i++) { } } 循环次数为n - 1,否则数组下标越界,下文会说明原因。 2. 内循环 for (int j = i; j > 0 && a[j] < a[j - 1] ; j--) { int temp = a[j]; a[j] = a[j - 1]; a[j - 1] = temp; } 交换条件为后一项小于前一项,每次都是a[j]与a[j - 1] 比较,所以只能有n - 1 次循环,否则数组下标越界。 所以

算法之排序(上)

守給你的承諾、 提交于 2020-02-27 08:02:47
文章来源: http://blog.seclibs.com/算法之排序(上)/ 排序算法有很多种,甚至有很多都完全没有听过,我们最常见,也最经典的就是:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。 按照时间复杂度来进行划分可以将其划分为三类 O(n2) :冒泡、插入、选择;基于比较 O(nlogn):快排、归并;基于比较 O(n):桶、计数、基数;不基于比较 这次我们来说时间复杂度为O(n2)的 在说具体的排序方法之前,先明确排序算法的评价标准 首先是排序算法的执行效率,执行效率一般从最好、最坏、平均时间复杂度上分析,其分析时间复杂度时需要考虑系数、常数和低阶,因为时间复杂度是在数据规模特别大的时候的增长趋势,在平时的代码中,数量级都是比较小的,所以还需要考虑这些问题。在基于比较的排序算法中,数值比较的次数和数据的移动次数也都是需要考虑进去的。 其次是内存的消耗,算法的内存消耗可以用空间复杂度来表示,当空间复杂度为O(1)的算法也可以称之为原地排序算法。 最后是算法的稳定性,当一组数据中有两个相同的值时,排序之后两个值的顺序是如果没有交换那它就是具有稳定性的算法。 然后我们再引入两个概念, 有序度 和 逆序度 有序度 是数组中具有有序关系的元素对的个数。 比如说2、4、3、1、5、6这组数组的有序度是11,因为它有11个有序元素对,分别是(2,4)

Java实现的5大排序算法

会有一股神秘感。 提交于 2020-02-27 06:48:12
Java实现的5大排序算法 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。 废话不多说,下面逐一看看经典的排序算法: 1、Java排序算法之选择排序 选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。 举个实例来看看: 1.初始: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11] 2.3.i = 0: [2 , 17, 16, 16, 7, 31, 39, 32, 38 , 11] (0th [38]<->8th [2]) 4.5.i = 1: [2, 7 , 16, 16, 17 , 31, 39, 32, 38, 11] (1st [38]<->4th [17]) 6.7.i = 2: [2, 7, 11 , 16, 17, 31, 39, 32, 38, 16 ] (2nd [11]<->9th [16]) 8.9.i = 3: [2, 7, 11, 16, 17, 31, 39, 32, 38, 16] ( 无需交换 ) 10.11.i = 4: [2, 7, 11, 16, 16 ,

Java实现的5大排序算法

拈花ヽ惹草 提交于 2020-02-26 15:11:29
Java实现的5大排序算法 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。   废话不多说,下面逐一看看经典的排序算法:   1、Java排序算法之选择排序   选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。   举个实例来看看:   1.初始: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11]   2.3.i = 0: [2 , 17, 16, 16, 7, 31, 39, 32, 38 , 11] (0th [38]<->8th [2])   4.5.i = 1: [2, 7 , 16, 16, 17 , 31, 39, 32, 38, 11] (1st [38]<->4th [17])   6.7.i = 2: [2, 7, 11 , 16, 17, 31, 39, 32, 38, 16 ] (2nd [11]<->9th [16])   8.9.i = 3: [2, 7, 11, 16, 17, 31, 39, 32, 38, 16] ( 无需交换 )   10.11.i = 4:

插入排序

半腔热情 提交于 2020-02-26 00:17:15
插入排序 插入排序的基本原则是,将一个待排序的元素,按照排序规则,插入到前面已经排好序的一组元素的适当位置,直到元素全部插入为止。根据寻找插入位置的不同方式,可将插入排序分为 直接插入排序 和 折半插入排序 ,还有一种对直接插入排序的优化方案 希尔排序 。 直接插入排序 直接插入排序的是,将一组待排序的元素第一个元素看做是有序的,然后从第二个元素开始,将他插入到前面排好序的一组元素的合适的位置。结合下面 的一组数据说吧 第一步:从元素8开始,往前查找,发现8比34小,则将8插入到34前面 第二步:从元素64开始,往前查找,发现没有比64小的元素,则64不动 第三步:从元素51开始,往前查找,发现没有比64小的元素,则64不动 。。。依次类推 代码实现 /** * 插入排序 * * @Author HXY * @Date 2020/2/25 */ public class InsertionSort { public static void sort ( int [ ] arr ) { int j = 0 ; for ( int i = 1 ; i < arr . length ; i ++ ) { int tmp = arr [ i ] ; for ( j = i ; j > 0 && arr [ j ] < arr [ j - 1 ] ; j -- ) { arr [ j ] =

插入排序

。_饼干妹妹 提交于 2020-02-25 19:01:29
1.什么是直接插入排序 依次将待排序中的数字直接插入到已按从小到大(或者从大到小)排好的序列中去,直到插完所有数字为止。 2.图示表示 3.代码实现 public static void insertSort(int[] array) { for (int bound = 1; bound < array.length; bound++) { int tmp = array[bound]; int cur = bound - 1; //[1,bound)为排序好的,[bound,array.length)是待排序的 for (cur = bound - 1; cur >= 0; cur--) { if (array[cur] > tmp) { array[cur + 1] = array[cur]; } else { break; } } array[cur + 1] = tmp; } } 来源: 51CTO 作者: Linnnna 链接: https://blog.51cto.com/14298563/2470120

插入排序

守給你的承諾、 提交于 2020-02-25 15:58:48
插入排序:简单并且稳定 (常用于小规模数据或基本有序数据) 算法复杂度为O(n^2) 分为前插排序和后插排序 插入排序的基本思想是:将数组的第一个数认为是有序数组,从后往前(从前往后)扫描该有序数组,把数组中其余n-1个数,根据数值的大小,插入到有序数组中,直至数组中的所有数有序排列为止。这样的话,n个元素需要进行n-1趟排序。 举个例子:4个数字4,6,7,5进行从大到小的排序。前插排序法具体过程如下: 把第一个数4插入到空的有序数组中的第一个位置上,得到新数字序列4; 第一趟:从后往前扫描有序数组,将第二个数字6和有序数组中的4进行比较,6大于4,此时将4后移一个位置。此时已经扫描完有序数组中的数,将6插入到4的前面(有序数组的第一个位置),得到新数字序列6,4; 第二趟:从后往前扫描有序数组,先将第三个数字7和有序数组中的4进行比较,7大于4,此时将4后移一个位置;再将7和有序数组中的6进行比较,7大于6,此时将6后移一个位置。此时已经扫描完有序数组中的数,将7插入到6的前面(有序数组的第一个位置),得到新数字序列7,6,4; 第三趟:从后往前扫描有序数组,先将第四个数字5和有序数组中的4进行比较,5大于4,此时将4后移一个位置;再将5和有序数组中的6进行比较,5小于6,由于有序数组就按照从大到小排列的,此时直接把5插入到4的前面即可!不需要再和7进行比较!最后

插入排序

一世执手 提交于 2020-02-24 20:01:15
1 /* 2 按从小到大排的序 3 */ 4 #include<iostream> 5 using namespace std; 6 int main(){ 7 int a[103]; 8 int n,temp,j; 9 cin>>n; 10 for(int i=0;i<n;i++) 11 cin>>a[i]; 12 for(int i=1;i<n;i++){//一共要插n-1个数 13 if(a[i]<a[i-1]){// 如何第i个数没有按照从小到大排 14 temp=a[i];//就将这个数提取出来 15 for(j=i-1;j>=0&&a[j]>temp;j--){//然后将i之前的序列看作是排好序的 16 //将temp插入到这个排好序的序列中 17 a[j+1]=a[j];//将a[j]向后移一位 18 } 19 a[j+1]=temp;//将temp插入 20 } 21 } 22 for(int i=0;i<n;i++)//输出 23 cout<<a[i]<<' '; 24 return 0; 25 } 插入排序的大致思路: 首先看这个数列a中,哪个数没有按照规定的顺序排列,如果发现了,就将它提取出来,存进temp中,这时将temp前边的所有数看成一个排好序的数列b(事实上,数列b确实是排好序的),我们现在要将temp插进这个数列b中去。 这时