【算法】【排序算法】【05】希尔排序

图解:https://www.runoob.com/data-structures/shell-sort.html

代码实现:

package _01_sort.cmp;

import java.util.Arrays;

public class _10_Shell {
    public void sort(int[] array){
       for( int gap = array.length >> 1;gap >= 1; gap = gap >> 1){
           //每个gap内有gap组
           for(int end = gap ;  end <= gap << 1 ; end++){
               //插入排序
               for(int i = end;i<= array.length -1;i +=gap){
                    for(int j = i;j>=gap;j-=gap){
                        if(array[j] < array[j-gap]){
                            int tmp = array[j];
                            array[j] =array[j-gap];
                            array[j-gap] = tmp;
                        }
                    }
               }
           }
       }
    }
    public static void main(String[] args) {
        int[] arr = {26,15,23,48,54,2,35,9,20,36,71,32,37,65};

        new _10_Shell().sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

package _01_sort.cmp;

import _01_sort.Sort;

import java.util.ArrayList;
import java.util.List;

/**
 * 希尔排序
 */
public class _10_ShellSortMJ <T extends Comparable<T>> extends Sort<T> {

    @Override
    protected void sort() {
        // 根据元素数量算出步长序列
        List<Integer> stepSequence = shellStpSequence();
        // 按步长序列划分进行排序
        for (Integer step : stepSequence) {
            sort(step); // 按step进行排序
        }
    }

    /**
     * 分成step列进行排序
     */
    private void sort(int step){
        // col: 第几列, column的简称
        for(int col = 0; col < step; col++){
            // 插入排序对每一列进行排序
            for(int begin = col + step; begin < array.length; begin += step){
                // col、col+step、col+2*step、col+3*step
                int cur = begin;
                while(cur > col && cmp(cur, cur - step) < 0){
                    swap(cur, cur - step);
                    cur -= step;
                }

            }
        }
    }

    /**
     * 希尔本人提出的步长序列
     */
    public List<Integer> shellStpSequence(){
        List<Integer> stepSequence = new ArrayList<>();
        int step = array.length;
        while((step >>= 1) > 0){
            stepSequence.add(step);
        }
        return stepSequence;
    }

}

【_09_QuickSortMj】
稳定性:false 	耗时:0.005s(5ms) 	比较:32.30万	 交换:1.25------------------------------------------------------------------
【_08_MergeSort】
稳定性:true 	耗时:0.006s(6ms) 	比较:26.10万	 交换:0
------------------------------------------------------------------
【_08_MergeSort2】
稳定性:true 	耗时:0.006s(6ms) 	比较:26.10万	 交换:0
------------------------------------------------------------------
【_09_QuickSort】
稳定性:false 	耗时:0.006s(6ms) 	比较:46.36万	 交换:0
------------------------------------------------------------------
【_10_ShellSort2】
稳定性:true 	耗时:0.01s(10ms) 	比较:60.86万	 交换:35.86------------------------------------------------------------------
【_10_ShellSortMJ】
稳定性:true 	耗时:0.01s(10ms) 	比较:60.86万	 交换:35.86------------------------------------------------------------------
【_03_HeapSort】
稳定性:false 	耗时:0.011s(11ms) 	比较:51.08万	 交换:2.00------------------------------------------------------------------
【_05_Insert_BinarySearch】
稳定性:true 	耗时:0.267s(267ms) 	比较:26.07万	 交换:0
------------------------------------------------------------------
【_02_Select】
稳定性:true 	耗时:0.394s(394ms) 	比较:2.00亿	 交换:2.00------------------------------------------------------------------
【_04_Insert】
稳定性:true 	耗时:0.566s(566ms) 	比较:9943.17万	 交换:9941.17------------------------------------------------------------------
【_04_Insert2】
稳定性:true 	耗时:0.584s(584ms) 	比较:1.47亿	 交换:0
------------------------------------------------------------------
【_01_Bubble】
稳定性:true 	耗时:1.279s(1279ms) 	比较:2.00亿	 交换:9941.17------------------------------------------------------------------
【_01_Bubble_3】
稳定性:true 	耗时:1.829s(1829ms) 	比较:2.00亿	 交换:9941.17------------------------------------------------------------------
【_01_Bubble_2】
稳定性:true 	耗时:1.849s(1849ms) 	比较:2.00亿	 交换:9941.17------------------------------------------------------------------
【_10_ShellSort】
稳定性:true 	耗时:2.31s(2310ms) 	比较:6.59亿	 交换:0
------------------------------------------------------------------

Process finished with exit code 0

不知道为什么我写的for循环很慢,mj的就很快

package _01_sort.cmp;

import _01_sort.Sort;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class _10_ShellSort2<T extends Comparable<T>> extends Sort<T> {

    public List<Integer> shellStpSequence(){
        List<Integer> stepSequence = new ArrayList<>();
        int step = array.length;
        while((step >>= 1) > 0){
            stepSequence.add(step);
        }
        return stepSequence;
    }


    protected void sort() {
        // 根据元素数量算出步长序列
        List<Integer> stepSequence = shellStpSequence();
        // 按步长序列划分进行排序
        for (Integer step : stepSequence) {
            sort(step); // 按step进行排序
        }
    }


    public void sort(int step){
           //每个gap内有gap组
//           for(int end = 0 ;  end <= step ; end++){
//               //插入排序
//               for(int i = end + step ; i<= array.length -1;i += step){
//                    for(int j = i;j>=step;j-=step){
//                        if(cmp(j , j-step) < 0){
//                            swap(j,j-step);
//                        }
//                    }
//               }
//           }
        for(int col = 0; col < step; col++){
            // 插入排序对每一列进行排序
            for(int begin = col + step; begin < array.length; begin += step){
                // col、col+step、col+2*step、col+3*step
                int cur = begin;
                while(cur > col && cmp(cur, cur - step) < 0){
                    swap(cur, cur - step);
                    cur -= step;
                }

            }
        }
       }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值