四、Java代码实现插入排序(和改进的希尔排序)

插入排序描述

  • ①、将数组分成两个区域、排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,
    插入到排序区域(每次插入要保证排序区域的顺序)
  • ②、重复以上步骤,直到整个数组有序。

优化方式

  • ①、待插入元素进行比较时,遇到比自己小的元素,就代表找到了插入位置,无需进行后续比较
  • ②、插入式可以直接移动元素,而不是直接交换元素

代码实现

import java.util.Arrays;

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

    // 插入排序
    public static void insertSort(int[] a) {
        // i 代表待插入元素的索引
        for (int i = 1; i < a.length; i++) {
            int t = a[i]; // 待插入元素值
            int j = i-1; // 已排序区域元素索引

            while (j>=0){
                if(t < a[j]){
                    a[j+1] = a[j]; // 移动元素                             
                }else {
                    break; // 退出循环,减少比较次数
                }
                j--;
            }
            a[j+1] = t; // 执行插入操作

        }

    }

}

插入排序和选择排序的比较

  • ①、二者平均时间复杂度都是O(n²)
  • ②、大部分情况下,插入都略优于选择
  • ③、有序集合插入的时间复杂度为O(n)
  • ④、插入属于稳定排序算法,而选择属于不稳定排序算法

插入排序算法的问题

当数组中的大元素都在数组的前面时 那么这些大元素在插入排序的过程中就需要移动很多次才能到达指定位置
为了优化这一现象 又诞生了希尔排序

希尔排序相关

希尔排序Java代码实现

public static void main(String[] args){
    int[] array={49,38,65,97,76,13,27,49,78,34,12,64,1};
    System.out.println("排序之前:");
    for(int i=0;i<array.length;i++){
        System.out.print(array[i]+" ");
    }
    //希尔排序
    int gap = array.length;
    while (true) {    
        gap /= 2;   //增量每次减半    
        for (int i = 0; i < gap; i++) {        
            for (int j = i + gap; j < array.length; j += gap) {//这个循环里其实就是一个插入排序                       
                int k = j - gap;            
                while (k >= 0 && array[k] > array[k+gap]) {
                    int temp = array[k];
                    array[k] = array[k+gap];
                    array[k + gap] = temp;                
                    k -= gap;            
                }                
            }    
        }    
        if (gap == 1)        
            break;
    }
 
    System.out.println();
    System.out.println("排序之后:");
    for(int i=0;i<array.length;i++){
        System.out.print(array[i]+" ");
    }
}

你可能感兴趣的:(算法知识,java,开发语言,算法)