4.2_8种常用排序算法2(插入排序:直接插入排序+希尔排序)

【插入排序】

【直接插入排序实例】

package com.sort.demo2;

import java.util.Arrays;

/**
 * 插入排序
 */
public class InsertSort {

    public static void main(String[] args) {
        int[] arr = new int[]{1,4,5,7,3,9,8,0,2,6};
        System.out.println(Arrays.toString(arr));
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void insertSort(int[] arr) {
        //遍历所有的数字
        for (int i=1;i<arr.length;i++){
            //如果当前数字比前一数字小
            if(arr[i]<arr[i-1]){
                //把当前遍历的数字存起来
                int temp = arr[i];
                int j;
                for (j=i-1;j>=0&&temp<arr[j];j--){
                    //把前一个数字赋给后一个数字
                    arr[j+1]=arr[j];
                }
                //把临时变量(for循环外层的当前元素)赋给不满足条件的后一个元素
                arr[j+1]=temp;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/HigginCui/p/10596162.html

时间: 2024-11-06 09:26:58

4.2_8种常用排序算法2(插入排序:直接插入排序+希尔排序)的相关文章

算法学习之排序算法(四)(希尔排序)

1.算法思想 先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高. 希尔(Shell)排序又称为缩小增量排序,它是一种插入排序.它是直接插入排序算法的一种威力加强版. 希尔排序的基本思想是 把记录按步长 gap 分组,对每组

排序---内部排序算法(快排、希尔排序、归并排序、基数排序、冒泡、选择排序)比较

1.内部排序的复杂度总结 1)时间复杂度 4种排序的平均时间复杂度是O(nlog2n),"快些以nlog2n的速度归队"(快排.希尔排序.归并.堆排序) 最坏情况下,快排的时间复杂度为O(n*n) 2)空间复杂度 O(log2n)快排 O(n)归并 O(rd)基数 其他都是O(1) 3)稳定性 不稳定的:"考研复习痛苦啊,情绪不稳定,快些选一堆好友来聊天吧"(快排.希尔.简单选择排序.堆排序) 其他都是稳定的. 4)一趟排序,保证一个关键字到达最终位置 交换类(起泡

排序算法&lt;No.6&gt;【插入排序】

算法,我在路上,将自己了解的算法内容全部梳理一遍! 今天介绍简单点的,插入排序. 首先,什么是插入排序,这个维基百科上有.个人的理解,就是将一个数插入到一个已经排好序的数列当中某个合适的位置,使得增加了一个元素的新的数列依然是有序的.比如,当前有一个待排序的数组A,我们可以认为这个数组是由两部分组成的,一部分是有序的数列B,一部分是无序的数列C,将无序数列中的元素逐个的取出,添加到有序数列中,两个数列的长度是变化关系是:B从1逐次增加1,而C的长度是逐次减少1,直到B的长度和A一样长,C的长度为

五种常用的算法设计技巧之二:分治算法

一,介绍 分治算法主要包含两个步骤:分.治.分,就是递归地将原问题分解成小问题:治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式 分治算法一般都可以写出一个递归表达式:比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N) T(N)代表整个原问题,采用了分治解决方案后,它可以表示成: ①分解成了两个规模只有原来一半(N/2)的子问题:T(N/2) ②当解决完这两个子问题T(N/2)之后,再合并这两个子问题需要的代价是 O(N) 递

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

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

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

插入排序     包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序).属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) . 直接插入排序: 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]

排序算法(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) {

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