Java插入排序

插入排序:
1.直接插入排序
2.二分法插入排序
3.希尔排序

1>直接插入排序

基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排好序的序列的合适位置(从后向前找),直到全部插入排序完为止。


public class InsertSort {

    public static void main(String args[]) {
        int[] a = {20,1,32,6,9,0,12,3,16};
        System.out.print("排序前: ");
        for(int i=0; i<a.length; i++) {
            System.out.print(a[i] + " ");
        }

        System.out.println();     //换行

        //直接插入排序
        for(int i=1; i<a.length; i++) {
            int temp = a[i];
            int j;
            for(j=i-1; j>=0; j--) {
                if(a[j] > temp) {
                    a[j+1] = a[j];
                } else {
                    break;
                }
            }
            a[j+1] = temp;
            }

            System.out.print("排序后: ");
               for(int i=0; i<a.length; i++) {
                   System.out.print(a[i] + " ");
            }

    }

}

结果为:
排序前: 20 1 32 6 9 0 12 3 16
排序后: 0 1 3 6 9 12 16 20 32

2>二分法插入排序

基本思想:二分法插入排序的思想和直接插入一样。但寻找合适位置插入的方式不同,二分法可减少比较次数。

public class BinaryInsertSort {

    public static void main(String args[]) {
        int[] a = {12,3,1,34,5,9,32,10};
        System.out.print("排序前: ");
           for(int i=0; i<a.length; i++) {
               System.out.print(a[i] + " ");
           }

           System.out.println();   //换行

           //二分法插入排序
           sort(a);
           System.out.print("排序后: ");
              for(int i=0; i<a.length; i++) {
                  System.out.print(a[i] + " ");
              }
    }

    private static void sort(int[] a) {
        for(int i=0; i<a.length; i++) {

            int temp = a[i];
            int left = 0;
            int right = i-1;
            int mid = 0;

            while(left <= right) {
                mid = (left + right)/2;
                if(temp < a[mid]) {
                    right = mid-1;
                }  else {
                    left = mid+1;
                }
            }
            for(int j=i-1; j>=left; j--) {
                a[j+1] = a[j];
            }
            if(left != i) {
                a[left] = temp;
            }
        }

    }
}

结果为:
排序前: 12 3 1 34 5 9 32 10
排序后: 1 3 5 9 10 12 32 34

3>希尔排序

基本思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中。
实质:分组插入的方法


public class ShellSort {

    public static void main(String args[]) {
        int[] a = {2,12,3,45,30,99,1,29};
        System.out.print("排序前: ");
           for(int i=0; i<a.length; i++) {
               System.out.print(a[i] + " ");
           }

           System.out.println();    //换行

           //希尔排序
           int d = a.length;
           while(true) {
               d = d/2;
               for(int x=0; x<d; x++) {
                   for(int i=x+d; i<a.length; i=i+d) {
                       int temp = a[i];
                       int j;
                       for(j=i-d; j>=0 && a[j]>temp; j=j-d) {
                           a[j+d] = a[j];
                       }
                       a[j+d] = temp;
                   }
               }

               if(d == 1) {
                   break;
               }
           }
           System.out.print("排序后: ");
              for(int i=0; i<a.length; i++) {
                  System.out.print(a[i] + " ");
              }
    }

}

结果为:
排序前: 2 12 3 45 30 99 1 29
排序后: 1 2 3 12 29 30 45 99

点赞