zoukankan      html  css  js  c++  java
  • 插入排序

    插入排序分为直接插入排序和希尔排序

    直接插入排序:

    直接插入排序原理就是,假设前面n-1(n>=2)个元素已经排好序,现在要把第n个元素找到正确的位置并插入。

    import java.util.Arrays;
    
    public class Main {
        static  int[] array = {7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2,10,-3};
        public static void main(String[] args) throws InterruptedException {
            System.out.println(Arrays.toString(array));
            insertionSort(array);
            System.out.println(Arrays.toString(array));
        }
    
        //插入排序
        public static void insertionSort(int[] array){
            int len = array.length;
            int counter = 1;
            for(int i=1;i<len;i++){
                int temp = array[i];  //存储待排序的元素值
                int insertPoint = i-1;  //与待排序元素值作比较的元素的下标
    
                while(insertPoint>=0 && array[insertPoint]>temp){ //当前元素比待排序元素大
                    array[insertPoint+1]= array[insertPoint];  //当前元素后移一位
                    insertPoint--;
                }
                array[insertPoint+1]= temp;  //找到了插入位置,插入待排序元素
                System.out.print("第"+counter+"轮排序结果:");
                display(array);
                counter++;
            }
        }
    
        private static void display(int[] array){
            System.out.println(Arrays.toString(array));
        }
    }
    [7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2, 10, -3]
    第1轮排序结果:[7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2, 10, -3]
    第2轮排序结果:[7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2, 10, -3]
    第3轮排序结果:[6, 7, 8, 9, 1, 4, 3, 2, 5, 0, -1, -2, 10, -3]
    第4轮排序结果:[1, 6, 7, 8, 9, 4, 3, 2, 5, 0, -1, -2, 10, -3]
    第5轮排序结果:[1, 4, 6, 7, 8, 9, 3, 2, 5, 0, -1, -2, 10, -3]
    第6轮排序结果:[1, 3, 4, 6, 7, 8, 9, 2, 5, 0, -1, -2, 10, -3]
    第7轮排序结果:[1, 2, 3, 4, 6, 7, 8, 9, 5, 0, -1, -2, 10, -3]
    第8轮排序结果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -1, -2, 10, -3]
    第9轮排序结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -2, 10, -3]
    第10轮排序结果:[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -2, 10, -3]
    第11轮排序结果:[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -3]
    第12轮排序结果:[-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -3]
    第13轮排序结果:[-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    View Code

    希尔排序:实质就是分组插入排序,该方法又称缩小增量排序

    原理:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

    因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

    比如一个长度为12的数组,

    第一步就是分成增量为6的小数组,一共6个,每一个都含有2个元素,对每一个小数组都进行直接插入排序

    第二步就是将数组分成增量为3的小数组,一共有4个,每个都含有3个元素,对每个小数组都进行直接插入排序

    第三步就是将整个数组进行直接插入排序。

    分别是12/2=6,6/2=3,3/2=1,增量为1时,其实就是对整个数组进行操作。

    ==========================================

    如果是奇数怎么办呢?

    比如一个长度为13的数组

    第一步还是分成增量为6的小数组,一共6个,但是第一个小数组会有3个元素,其他的分别有两个,然后对每个小数组进行直接插入排序

    第二步分成增量为3的小数组,一共有4个,但是第一个小数组有5个元素,其他的分别有4个元素,然后对每个小数组进行直接插入排序

    第三步就是将整个数组进行直接插入排序。

    ============================================

    import java.util.Arrays;
    
    public class Main {
        static  int[] array = {7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2,-3};
        public static void main(String[] args) throws InterruptedException {
            System.out.println(Arrays.toString(array));
            shellSort(array);
            System.out.println(Arrays.toString(array));
        }
    
        static void shellSort(int a[])
        {
            int n=a.length;
            int i, j, gap;
    
            for (gap = n / 2; gap > 0; gap /= 2) //步长
            {
                for (i = 0; i < gap; i++)        //直接插入排序
                {
                    for (j = i + gap; j < n; j += gap) {
                        if (a[j] < a[j - gap]) {
                            int temp = a[j];
                            int k = j - gap;
                            while (k >= 0 && a[k] > temp) {
                                a[k + gap] = a[k];
                                k -= gap;
                            }
                            a[k + gap] = temp;
                        }
                    }
                    System.out.print("增量:"+gap+"     ");
                    for(int k=i;k<n;k+=gap){
                        System.out.print(a[k]+"	");
                    }
                    System.out.println("");
                }
            }
        }
    }
    [7, 8, 9, 6, 1, 4, 3, 2, 5, 0, -1, -2, -3]
    增量:6     -3    3    7    
    增量:6     2    8    
    增量:6     5    9    
    增量:6     0    6    
    增量:6     -1    1    
    增量:6     -2    4    
    增量:3     -3    0    3    6    7    
    增量:3     -1    1    2    8    
    增量:3     -2    4    5    9    
    增量:1     -3    -2    -1    0    1    2    3    4    5    6    7    8    9    
    [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    View Code

    http://blog.csdn.net/u012152619/article/details/47306209

    http://blog.csdn.net/morewindows/article/details/6668714

    http://blog.csdn.net/u012152619/article/details/47405799

    http://www.cnblogs.com/jingmoxukong/p/4303279.html

  • 相关阅读:
    列表标签
    超链接标签
    HTML:如何把一个无序列表转换成横向菜单
    window界面控制
    C++文件读写
    宽度,对齐方式的设置
    取出一个整数的每一位
    求两个数的最大公约数
    判断素数
    天才ACM ---待复习标志
  • 原文地址:https://www.cnblogs.com/hongdada/p/6208097.html
Copyright © 2011-2022 走看看