每天一算法 -- (插入排序)

一、原理

  插入排序就是把当前待排序的元素插入到一个已经排好序的列表里面。对于给定的一组记录,初始时假定第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直到最后一个记录插到有序序列中为止。

二、思路

  1.在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数找到相应位置并插入,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

  2.例子:假设有一个数组 :{3,1,2,8,7,9}

    第一趟:1和3比较,1<3,则将1和3的位置互换,为:

        1,3,2,8,7,9

    第二趟:2和1、3比较,2<3,则将2和3的位置互换,为:

       1,2,3,8,7,9

    第三趟:8和1、2、3比较,8>前面的,则位置不变,为:

         1,2,3,8,7,9

    第四趟:7和1、2、3、8比较,7<8,则7和8的位置互换,为:

         1,2,3,7,8,9

    第五趟:9和1、2、3、7、8比较,9>前面的,则位置不变,为:

         1,2,3,7,8,9

三、时间复杂度

  在第一趟排序中,插入排序最多比较一次,第二趟最多比较两次,依次类推,最后一趟最多比较N-1次,因此有:

  1+2+3+...+N-1 = N*N(N-1)/2.

  然而,因为在每一趟排序发现插入点之前,平均只有全体数据项的一半真的进行了比较,除以2得到:

  N*N(N-1)/4.

  复制的次数大致等于比较的次数。然而,一次复制与一次比较的时间耗费不同,所以相对随机数据,这个算法比冒泡排序快一倍,比选择排序略快。

  在任意情况,对于随机顺序的数据进行排序的时间复杂度为O(n2);对于已经有序或基本有序的数据来说,插入排序要好得多。当数据有序的时候,while循环的条件总是假。所以他就变成了外层循环中的一个简单语句,执行n-1次,在这种情况下,算法运行只需要O(n)的时间。如果基本有序,插入排序只需要O(n)的时间。但是,对于逆序排列的数据,每次比较和移动都会执行,所以插入排序不必冒泡排序快。

四、代码实现

 1 /**
 2  * 排序算法
 3  * @author Administrator
 4  */
 5 public class Sort {
 6
 7     /**
 8      * 插入排序
 9      * @param arr
10      */
11     public static void insertSort(int[] arr){
12
13         int insert = 0;  // 要插入的元素
14         int j = 0;
15
16         for(int i = 1; i < arr.length; i ++){    // 从数组的第二个元素开始循环将数组中的元素插入
17             insert = arr[i];      // 设置数组中的第2个元素为第一次循环要插入的数据
18             j = i - 1;   // 与待排序元素值作比较的元素的下标
19             while(j >= 0 && insert < arr[j]){    // 如果要插入的元素小于第j个元素,就将第j个元素向后移动
20                 arr[j + 1] = arr[j];
21                 j --;
22             }
23             arr[j + 1] = insert;    // 找到了插入的位置,插入
24         }
25
26         for(int i = 0;i < arr.length; i ++){
27             System.out.print(arr[i] + "  ");
28         }
29     }
30
31     /**
32      * 测试
33      * @param args
34      */
35     public static void main(String[] args) {
36         int[] arr = {3,1,2,8,7,9};
37         insertSort(arr);
38     }
39 }
时间: 2024-10-11 07:43:28

每天一算法 -- (插入排序)的相关文章

java算法插入排序优化代码

原文:java算法插入排序优化代码 代码下载地址:http://www.zuidaima.com/share/1550463280630784.htm 一个细节让插入排序更具效率 运行此方法需要为main方法传递参数 package com.zuidaima.sort; /** *@author www.zuidaima.com **/ public class TestSort { public static void main(String args[]){ int l = args.len

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

经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行.   图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入. 以下代码仅供参考,欢迎指正 /// <summary> /// 插入排序 /// </summary> /// <param na

插入排序算法---插入排序与希尔排序

本文主要说明插入排序.shell排序两种排序方法.  一.插入排序  算法思想:  假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性. 一般来说,插入排序都采用in-place在数组上实现.具体算法描述如下: ⒈ 从第一个元素开始,该元素可以认为已经被排序 ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描 ⒊ 如果

java入门排列算法 - - &gt;插入排序(代码量最少)

要理解插入排序,首先得理解实现一个算法-->对于一个已经从大到小排好序的数组a[],插入一个value使得整个数组的顺序依然是从大到小的: 这个算法的实现非常简单,不做探讨. 对于乱序数组a[];在外层i循环中,第一次循环,我假定数组只有一个元素a[0],以a[1]作为value来插入,第一次循环结束可以得到一个有序数组, 第二次循环以数组有两个元素a[0],a[1],再以a[2]作为value去插入,以此类推实现整个数组排序. import java.lang.reflect.Array;im

疯狂的Java算法——插入排序,归并排序以及并行归并排序

从古至今的难题 在IT届有一道百算不厌其烦的题,俗称排序.不管是你参加BAT等高端笔试,亦或是藏匿于街头小巷的草根笔试,都会经常见到这样一道百年难得一解的问题. 今天LZ有幸与各位分享一下算法届的草根明星,排序届的领衔大神——插入排序以及归并排序.最后,在头脑风暴下,LZ又有幸认识了一位新朋友,名叫并行归并排序.接下来,咱们就一一认识一下,并且在最后来一次“算林大会”吧. 插入排序简介 插入排序,算林称最亲民的排序算法,插入排序采用最简单的插入方式对一个整数数组进行排序.它循环数组中从第二个开始

排序算法:插入排序,折中插入排序

1??插入排序:把序列分为有序和无序两部分排序,如果是升序,则无序和有序比较小则有序右移直到找到大于有序值然后替换,大于则不变,有序++:继续比较: 主要用途:直接插入算法实现简单,在序列基本有序的情况下,移动和比较的次数少,所以有序情况下优先插入排序 复杂度与稳定度:属于稳定的排序方法,时间复杂度 O(n^2) 空间复杂度 O(1); C/C++: 1 #include <iostream> 2 3 int *InsertSort(int *Array, int size) 4 { 5 if

排序系列算法——插入排序

1. 原理 插入排序是顾名思义是将未进行排序的元素不断插入到已排序序列中的排序方法.如下图所示: 插入排序说白点就是在以排序的序列中找到未排序元素的位置,并将元素插入行程新的已排序序列的过程. 2.排序过程及算法设计 排序过程 以一个实际的例子为例: 设有序列{7,9,6,12,15,11},使用插入排序对上述的序列按从小到大进行排序,排序的过程可描述如下: 算法设计 插入排序是将元素插入已排序序列的过程,排序过程需要将元素与已排序的序列元素进行对比,采用从后往前的对比顺序,不断向前移动,直到不

算法----插入排序算法

插入排序:有n个数,第i个数前面都是有序的话,那么i插入到排好的系列中就非常简单,和前面的数一一比较就ok了,对于一个序列,那么从第二个数开始和前面数比较,排好前面2个数之后来把第三个数插入到前面2个数中就非常简单了,第四个数亦是如此,以此类推..................... 仔细分析: 工作机制是----假设元素3插入到1 4 5 6 7 8中去,那么用3与8比较,8比3大,那么8在数组中位置后移动一位,在用3与7比较,7又比3大,同样7在数组中的位置也后移动一位,再与6比较,依次类

经典排序算法——插入排序

对于一个int数组,请编写一个插入排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: 输入数组:[1,2,3,5,2,3],6 输出数组:[1,2,2,3,3,5] class InsertionSort { public: int* insertionSort(int* A, int n) { // write code here for(int i=1;i<n;++i) { int insertNum=A[i];//待插入元素 int j=i;

白话排序算法--插入排序

前言: 昨天下午写好了冒泡排序后,紧跟其后,今天跟新上插入排序算法. 插入排序:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 情景描述: 紧接冒泡排序,每次同学们都屡试不爽,但是学生越来越多了,老师发现每次排完队,就耽搁了大半节课时了,说道:“咱不用冒泡了,有点OUT了,今天来插入排序”.这时体育老师担任起了数学老师的职责,又给同学们讲了种排队方式--插入排序. 开始以第一位同学为基准,由第二个同学开始向前和第一位同学比较,个头高了不动,低了换位