Java 排序算法: 插入排序 (简单插入排序 和 希尔排序)

五大排序内部算法:

  1. 选择排序
  • 简单选择排序
  • 堆排序
  1. 插入排序
  • 简单插入排序
  • 希尔排序
  1. 交换排序
  • 冒泡排序
  • 快速排序
  1. 归并排序
  2. 基数排序

简单插入排序

插入排序(Insertion Sorting) 的基本思想:

把n个待排序的元素看成为一个有序表和一个无序表, 开始时有序表中只包含一个元素, 无序表中包含有 n-1 个元素, 排序过程中每次从无序表中取得第一个元素, 把它的排序码依次与有序元素表元素的排序码进行比较, 将它插入到有序表中的适当位置, 使之成为新的有序表.

package com.dhl.day.day01.sort;

import java.util.Arrays;

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

    public static void insertSort(int[] arr) {
    
    
        int insertValue = 0;
        int insertIndex = 0;
        for (int i = 1; i < arr.length; i++) {
    
    
            insertIndex = i;
            insertValue = arr[i];
            while (insertIndex-1 >= 0 && insertValue < arr[insertIndex-1]) {
    
    
                arr[insertIndex] = arr[insertIndex-1];  // arr[insertIndex] 被覆盖, 找到后放到这里即可
                insertIndex--;
            }
            // 已经找到了要插入的位置
            arr[insertIndex] = insertValue;
        }
    }
}

希尔排序(在简单插入排序基础上加入步长的概念)

基本思想:

希尔排序是插入排序的一种,不过希尔排序是将序列按下标的一定增量分组,分别对每组序列使用直接插入排序算法排序,随着步长逐渐减少,每组包含的元素越来越多,当增量减至1时,整个序列恰被分成一组,再进行一次整个序列的直接插入排序,整个算法就此终止。

代码实现:

package com.com.beyond.dhl.utils.sort;

import java.util.Arrays;

public class ShellSort {
    
    


    public static void main(String[] args) {
    
    
        int[] arr = {
    
    1, 5, 3, 2, 6, 7, 0, -3};
        System.out.println("插入排序前:" + Arrays.toString(arr));
        shellSort(arr);
        System.out.println("插入排序后:" + Arrays.toString(arr));
    }

    public static void shellSort(int[] arr) {
    
    
        // 增量 gap, 并且逐步缩小增量(步长)
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
    
    
            // 从第 gap 元素开始, 逐个对其所在的组进行直接插入排序
            for (int i = gap; i < arr.length; i++) {
    
    
                int j = i;
                int temp = arr[j];
                if (arr[j] < arr[j - gap]) {
    
    
                    while (j - gap >= 0 && temp < arr[j - gap]) {
    
    
                        // 移动
                        arr[j] = arr[j-gap];
                        j -= gap;
                    }
                    // 位置已经找到
                    arr[j] = temp;
                }
            }


        }
    }
}

800万数据测试结果

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Beyond_Nothing/article/details/113188941