排序算法(3/4) 之 插入排序_md

插入排序

1、 直接插入排序 (稳定排序

在已经排好的队列中插入新的元素

流程:

复杂度:
时间复杂度:O(n^2)
空间复杂度:O(1)
代码实现(JAVA)

    public static void main(String[] args) {

        int[] arr = new int[]{32, 34, 55, 12, 32, 10};
        insertSort(arr);
        OutUtil.out(arr);

    }

    private static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int tmp = arr[i];
            int j = i - 1;
            // 从当前位置倒着遍历
            for (; j >= 0 && tmp < arr[j]; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = tmp;
            OutUtil.out(arr);
        }
        OutUtil.out(arr);
    }

二、希尔排序 (不稳定排序)

直接插入排序的优化

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。

例子

复杂度:
时间复杂度:O(n^3/2)
空间复杂度:O(1)
代码实现(JAVA)
 private static void shellSort(int[] arr) {
        int increment = arr.length;
        while(increment >1) {
            increment = increment/3 + 1;
            System.out.println("increment : " + increment);
            for (int i = increment; i< arr.length; i++) {
                // 其实是直接插入排序, 不过每个排序的元素之间的间隔是 increment
                int temp = arr[i];
                int j = i - increment;
                for (; j >= 0 && temp < arr[j] ; j -= increment) {
                    arr[j + increment] = arr[j];
                }
                arr[j + increment] = temp;
            }
            OutUtil.out(arr);
        }
    }

原文地址:https://www.cnblogs.com/lidejie34/p/10157401.html

时间: 2024-08-19 01:12:17

排序算法(3/4) 之 插入排序_md的相关文章

排序算法《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

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

常见的排序算法实现(直接插入排序,冒泡排序,快速排序,建大选择排序),还有几个下次写上. #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]

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

二分插入排序   也称折半插入排序, 1.基本思想:设数列[0....n]分为两部分一部分是[0...i]为有序序列,另一部分是[i+1.....n]为无序序列,从无序序列中取一个数 x ,利用二分查找算法找到 x 在有序序列中的插入位置并插入,有序序列还是有序的,接下来重复上述步骤,直到无序序列全部插入有序序列 ,这是整个序列只剩下有序序列即有序了. 2.代码:    3.复杂度: 用二分插入排序所要进行的总比较次数为O(lgn),当n较大时,比直接插入排序的最大比较次数小得多,但大于最小比较

复习数据结构:排序算法(一)——插入排序

从这一篇开始,计划复习一下数据结构的基本知识.一来是为了开年之后的找工作,二来是为了想提升自己的编程能力.由于这些数据结构知识点,之前都学习过,这里我们就提炼出每个知识点的核心,以及代码实现. 这篇先说排序算法中的插入排序. 插入排序是一种稳定排序算法,属于内排序.适合少量数据量的排序. 当输入数组已经排好序时,插入排序需要O(n),快排需要O(n^2). 当输入数组倒序排列时,插入排序时复为:O(n^2). 平均时间复杂度:O(n^2). 代码实现如下: #include<iostream>

排序算法(三)插入排序

1.基本思想 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入. 插入排序非常类似于整扑克牌,在开始摸牌时,左手是空的,牌面朝下放在桌上.接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上.为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较.无论什么时候,左手中的牌都是排好序的. 如果输入数组已经是排好序的话,插入排序出现最佳情况,其运行时间是输入规模的一个线性函数.如果输入数组是逆序排列的,将出现最坏情况.平均情况与最坏情况一样,其

常见的排序算法(一) 插入排序

插入排序分为:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序).属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) . 在这里我具体讲直接插入排序和希尔排序. 直接排序插入 直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位置.直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的.当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数

排序算法(三)——插入排序及改进

插入排序 基本思想 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数找到相应位置并插入,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. java实现 //插入排序 public void insertionSort(){ int len = array.length; int counter = 1; for(int i=1;i<len;i++){ int temp = array[i]; //存储待排序的元素值 int insertPo

《排序算法系列3》插入排序

1 原理 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入 插入排序的工作方式非常像人们排序一手扑克牌一样.开始时,我们的左手为空并且桌子上的牌面朝下.然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置.为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,如下图所示: 2 思路 从第2个数开始,放到前面的数组中,形成一个有序数组 然后把第3个数放到前