希尔排序

希尔排序法又称为缩小增量法,希尔排序的基本思想是:先选定一个整数(通常是gap/3+1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每一组内的记录进行排序,然后gap=gap/3+1得到下一个整数,再将数组分成各组,进行插入排序,当gap1时,就相当于直接插入排序。其实希尔排序是对直接插入排序的优化,直接插入排序组中记录的间隔是1,而希尔排序是取一个特定的整数,进行分组,在组内进行插入排序,然后缩小这个数,让数组不断有序,这些步骤都是对数组进行预排序,直到最后gap1时,就是进行直接插入排序,这种排序方式相比较直接插入排序来说,大大缩短了排序的时间,希尔排序的实现代码如下:

import java.util.Arrays;
public class ShellSort {
    public static void main(String[] args) {
        int[] array={3,6,4,1,9,7,6,5,4,0,10,8,21,35};
        System.out.println(Arrays.toString(array));
      shellSort01(array);
        System.out.println(Arrays.toString(array));
    }

    private static void shellSort01(int[] array) {
        int gap=array.length;
        while(true){
            gap=gap/3+1;
            insertSortWithGap01(array,gap);
            if(gap==1){
                break;
            }
        }
    }

    private static void insertSortWithGap01(int[] array, int gap) {
        for(int i=gap;i<array.length;i++){
            int key=array[i];
            int j;
            for(j=i-gap;j>=0&&array[j]>key;j-=gap){
                array[j+gap]=array[j];
            }
            array[j+gap]=key;
        }
    }
}

在这里插入图片描述
希尔排序的时间复杂度:最好: O(n) -->数组有序
平均:O(n^1.3)
最坏:O(n^2)
希尔排序的空间复杂度:O(1)

你可能感兴趣的:(java)