码迷,mamicode.com
首页 > 编程语言 > 详细

希尔排序(ShellSort)

时间:2020-07-21 23:14:48      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:lang   元素   util   一个   sort   ack   ring   最坏情况   break   

1.1概述

1959年Shell发明,第一个突破O(n^2)的排序算法,是简单插入排序的改进版。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。

1.2描述

  • 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • 按增量序列个数k,对序列进行k 趟排序;
  • 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

1.3代码

package shellsort;

import java.util.Arrays;

/**
 * @author xgj
 */
public class ShellSort {
    public static void main(String[] args) {
        int[] res = new int[]{1,2,5,4,6,8,7,9};
        int[] ints = ShellSort.shellSort(res);
        System.out.println(Arrays.toString(ints));
    }

    public static int[] shellSort(int[] arr){
        //inc是增量
        int temp = 0;
        int j = 0;
        //增量默认是长度的一半,每次变为之前的一半,直到最终数组有序
        for(int inc=arr.length/2 ; inc>=1 ; inc/=2){
            for(int i=inc ; i<arr.length; i++){
                temp = arr[i];
                //将当前的数与减去增量之后位置的数进行比较,如果大于当前数,将他后移
                for(j=i-inc; j>=0;j-=inc){
                    if(arr[j]>temp){
                        arr[j+inc] = arr[j];
                    }else{
                        break;
                    }
                }
                //将当前数放到空出来的位置
                arr[j+inc]=temp;
            }
        }
        return arr;
    }
}

1.4分析

最佳情况:T(n) = O(nlog2 n) 最坏情况:T(n) = O(nlog2 n) 平均情况:T(n) =O(nlog n)

希尔排序(ShellSort)

标签:lang   元素   util   一个   sort   ack   ring   最坏情况   break   

原文地址:https://www.cnblogs.com/jiezao/p/13357086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!