**

1.直接插入排序

**(Straight Insertion Sort)

是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。

具体算法描述:

  1. 从第一个元素开始,该元素可以认为已经被排序。
  2. 取出下一个元素,在已排序元素中从后向前扫描。
  3. 如果该元素大于新元素,将该元素移向下一个位置。
  4. 重复步骤三,直到找到已排元素小于或等于新元素的位置。
  5. 将新元素插入该位置。
  6. 重复步骤2~5。

一组数据:5,2,4,6,1,3
排序2——插入排序:直接插入排序,希尔排序
代码实现:

import java.util.Arrays;

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = new int[] {5,3,2,8,5,9,1,0};
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    private static void insertSort(int[] arr){
        //遍历所有数字
        for (int i = 1; i <arr.length ; i++) {
            //如果当前数字比前一个数字小
            if (arr[i]<arr[i-1]){
                //把当前遍历的数字(insertNum)存起来
                int insertNum=arr[i];
                int j=0;
                //遍历当前数字前面所有的数字
                for(j=i-1;j>=0&&arr[j]>insertNum;j--){
                    //把前一个数字赋给后一个数字
                    arr[j+1]=arr[j];
                }
                //把临时变量(外层for循环的当前元素)赋给不满足条件的后一个元素
                arr[j+1]=insertNum;
            }
        }
    }
}

直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

2.希尔排序

希尔排序法

是针对直接插入排序算法的改进。该方法又称缩小增量排序。

基本思想

  1. 先取一个小于n的整数d1作为第一个增量
  2. 把文件的全部记录分成d1个组。
  3. 所有距离为dl的倍数的记录放在同一个组中。
  4. 先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

一组数据:9,1,2,5,7,4,8,6,3,5

排序2——插入排序:直接插入排序,希尔排序

import java.util.Arrays;

public class ShellSort {
    public static void main(String[] args) {
        int[] arr = new int[] {9,1,2,5,7,4,8,6,3,5};
        System.out.println(Arrays.toString(arr));
        shellSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    private static void shellSort(int[] arr){
        // 遍历所有的步长
        for (int d = arr.length / 2; d > 0; d /= 2) {
            // 遍历所有有元素
            for (int i = d; i < arr.length; i++) {
                // 遍历本组中所有的元素
                for (int j = i-d; j >= 0; j -= d) {
                    // 如果当前元素大于加上步长后的那个元素
                    if (arr[j] > arr[j + d]) {
                        int temp = arr[j];
                        arr[j] = arr[j + d];
                        arr[j + d] = temp;
                    }
                }
            }
        }
    }
}

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  3. 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N1.3—N2)
  4. 稳定性:不稳定

相关文章: