算法六之直接插入排序

一、直接插入排序基本思想

直接插入排序(straight insertion sort)的做法是:

每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

二、算法实现

 public static void insertSort(int[] data) {
        int temp;  //临时空间,保存要插入的数据
        int j;     //临时空间,保存当前移动数据的下标
        //从1开始,第一个元素是有序的
        for (int i = 1; i < data.length; i++) {
            //比较插入的数据与有序队列最后一个数据的大小关系
            if (data[i - 1] > data[i]) {
                temp = data[i];         //保存插入的数据
                data[i] = data[i - 1];  //将有序队列的最后一个数据移动到插入数据的位置
                //从有序队列的倒数第二个数据开始比较
                for (j = i - 2; j >= 0 && data[j] > temp; j--) {
                    data[j+1] = data[j];   //这些数据大于插入数据,往后移动一个位置
                }
                data[j+1]=temp;  //回填要插入的数据
            }

        }
    }
时间: 2024-10-10 06:53:27

算法六之直接插入排序的相关文章

算法整理(三):插入排序

插入排序很简单,就像打扑克.手里有个牌4,再来一张牌5就本能的放到第一个牌的右边.如果来了个3就从右往左扫描,只要左边的比这个待插入数字大就交换. 插入排序是一种稳定的排序方法,时间复杂度O(n*n),空间复杂度O(1),最好的情况下时间复杂度为O(1).即本来就是一个有序或者相等的数组,则只需比较n-1次即可.下为源码,只需三行代码即可. //============================================================================

算法导论—排序之插入排序

void insertion_sort(vector<int> &num){ for(int i = 1; i < num.size(); i++){ int j = i-1; int val = num[i]; while(j>=0 && num[j] >= val){ num[j+1] = num[j]; j--; } num[j+1] = val; } } 每次迭代时,将num[i] 作为key值,且前子数组[0,i-1] 构成已排好序,每次与左

排序算法《3》插入排序

算法实现: 使用插入排序将下面的数字按照从小到大的顺序排列 2 9 5 4 8 1 6 步骤1:数组中已经排好的是{1},将9插入数组中 步骤2:数组中已经排好的是{2,9},将5插入数组中 步骤3:数组中已经排好的是{2,5,9},将4插入数组中 步骤4:数组中已经排好的是{2,4,,5,9},将8插入数组中 步骤5:数组中已经排好的是{2,4,,5,8,9},将1插入数组中 步骤6:数组中已经排好的是{1,2,4,,5,8,9},将6插入数组中 步骤7:排序完成 1 2 4 5 6 8 9

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards

[算法学习笔记]直接插入排序笔记

直接插入排序概念: 带排元素放在elem[0...n-1]中,初始化时,elem[0]自成1个有序区,无序区为elem[1...n-1],从i=1起,到i=n-1,依次将elem[i]插入有序区[0...n-1]中 直接插入排序算法步骤: 1.在当前有序区域R[1,i-1]中查找R[i]的正确插入位置K(1<=K<=i-1) 2.将R[K,i-1]中的记录均向后移动 3.移动后腾出K位置,插入R[i] (最坏)时间复杂度:O(n^2) 空间复杂度:O(1) /// <summary>

各种算法六

各种算法六 继续我们各种算法的终结和回顾滴呀:不知道是谁说的,程序=算法+: 然后今天我们继续来讨论我们的各种算法: 首先我们来判断一个数是偶数还是奇数呢,卧槽,你可能说这个太简单了,对,这个实在太简单了,但我的目的是抛砖迎玉, 后面我会给出用递归的方式来时实现,体现出我们的递归思想滴呀: 简单代码示意: public static void IsOdd(int x) { if (x % 2 == 0) { Console.WriteLine("{0}是偶数", x); } else

让算法会说话之插入排序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/26059615 插入排序:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 一.插入排序算法 /*************************************************************** *版权所有 (C)2014,公司名称. * *文件名称:插入排序法 *内容摘要:无 *其它说明:无 *当前版

常见排序算法实现(直接插入排序,冒泡排序,快速排序,建大选择排序)

常见的排序算法实现(直接插入排序,冒泡排序,快速排序,建大选择排序),还有几个下次写上. #include "stdio.h" #include "stdlib.h" #include "malloc.h" #include <iostream> using namespace std; #define N 10 void showArr(int a[]); void InsertSort(int a[]);    //直接插入排序

八大排序算法学习笔记:插入排序(一)

插入排序     包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序).属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) . 直接插入排序: 1.算法的伪代码(这样便于理解):     INSERTION-SORT (A, n)             A[1 . . n] for j ←2 to n do key ← A[ j] i ← j – 1 while i > 0 and A[i] > key do A[i+1] ← A[i]