●希尔排序

●希尔排序
希尔排序法介绍

希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。

希尔排序法基本思想:

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

希尔排序代码


import java.util.Arrays;

public class shellSort {
    public static void main(String[] args) {
        int[] arr = {5,6,3,1,8,4,9,2,7};
       /* int[] arr = new int[8];
        for (int i=0;i<arr.length;i++){
            arr[i] = (int)(Math.random()*8);
        }
        */

        shellsort(arr);
        System.out.println(Arrays.toString(arr));
    }
    //希尔排序
    public static void shellsort(int[] arr){
        //增量gap, 变逐步的缩小增量
        for (int gap=arr.length/2;gap>0;gap/=2){
            //从第gap个元素,逐个对其所在的组进行直接插入排序
            for (int i=gap;i<arr.length;i++){
                int j = i;
                int temp = arr[j];
                if (arr[j]<arr[j-gap]){
                    while((j-gap>=0) && (temp<arr[j-gap])){
                        //移动
                        arr[j] = arr[j-gap];
                        j=j-gap;
                    }
                    //当退出while后, 就给temp找到插入位置
                    arr[j] = temp;
                }
            }
        }
    }
}

查看80000个随机数排序时间 代码


import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class shellSort {
    public static void main(String[] args) {
        int[] arr = new int[80000];
        for (int i=0;i<arr.length;i++){
            arr[i] = (int)(Math.random()*80000);
        }
        System.out.println("排序前");
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1Str = simpleDateFormat.format(date);
        System.out.println("排序前的时间是="+date1Str);
        shellsort(arr);
        Date date2 = new Date();
        String date2Str = simpleDateFormat.format(date2);
        System.out.println("排序后的时间是="+date2Str);

    }
    //希尔排序
    public static void shellsort(int[] arr){
        //增量gap, 变逐步的缩小增量
        for (int gap=arr.length/2;gap>0;gap/=2){
            //从第gap个元素,逐个对其所在的组进行直接插入排序
            for (int i=gap;i<arr.length;i++){
                int j = i;
                int temp = arr[j];
                if (arr[j]<arr[j-gap]){
                    while((j-gap>=0) && (temp<arr[j-gap])){
                        //移动
                        arr[j] = arr[j-gap];
                        j=j-gap;
                    }
                    //当退出while后, 就给temp找到插入位置
                    arr[j] = temp;
                }
            }
        }
    }
}
发布了40 篇原创文章 · 获赞 0 · 访问量 758

猜你喜欢

转载自blog.csdn.net/weixin_42463611/article/details/104514235
今日推荐