希尔排序-简单简单-重要点的是思维

图示如下:
希尔排序-简单简单-重要点的是思维
代码如下:

package 递归基础小题;
/**
 * @author 邓雪松 (づ ̄ 3 ̄)づ)
 * @create 2021-10-25-19-54
 */

import javax.print.attribute.standard.SheetCollate;

/**
 * 思路:如序列: 9 8 7 6 5 4 3 2 1
 *      确定一个增量序列,如4(length/2)-》2->1,从大到小使用增量
 *      使用第一个增量,将序列划分为若干个子序列,下标组合为0-4-8;1-5;2-6;3-7
 *      依次对子序列使用直接插入排序法;
 *      使用第二个增量,将序列划分为若干个子序列(0-2-4-6-8),(1-3-5-7)
 *      依次对子序列使用直接插入排序法:
 *      使用第三个增量1,这时子序列就是原序列(0-1-2-3-4-5-6-7-8),使用直接插入法
 *      完成排序
 * 时间复杂度:不太确定再O(nlogn)~O(n²)之间
 * 空间复杂度:O(1)
 * 原址排序
 * 稳定性:由于相同的元素可能会被划分到不同子序列单独排序,因此稳定是无法保证的——所以:不稳定
 */
public class 希尔排序 {
    public static void main(String[] args) {
        int[] arr = {9,9,6,7,5,4,2,2,1};
        System.out.println("原数组为:");
        dy(arr);
        System.out.println("\n经过排序后为:");
        shellSort(arr);
        dy(arr);
    }
    //打印方法
    public static void dy(int arr[]){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
    }
    //希尔排序
    public static void shellSort(int[] arr){
        //不断地减小增量 interval:是增量的意思 这个是个3层循环
        for(int interval = arr.length/2;interval>0;interval=interval/2){
            //增量为1的插入排序
            for (int i = interval; i < arr.length; i++) {
                int target = arr[i];
                int j = i-interval;
                while(j>-1 && target<arr[j]){
                    arr[j+interval]=arr[j];
                    j-=interval;
                }
                arr[j+interval]=target;
            }
        }
    }
}

运行结果如下

原数组为:
9	9	6	7	5	4	2	2	1	
经过排序后为:
1	2	2	4	5	6	7	9	9	
上一篇:Linux常用统计命令之wc


下一篇:linux--安装zbar,亲测有效