Day564.希尔排序 -数据结构和算法Java

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day564.希尔排序 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。

希尔排序

1、介绍

插入排序Plus

2、基本思想

3、排序示意图

4、交换法代码实现

	//交换法
    public static void shellSort1(int arr[]) 
        int temp = 0;

        //整合
        for (int gap = arr.length/2 ; gap > 0 ; gap /= 2) 
            for (int i = gap; i < arr.length; i++) 
                //遍历各组中所有的元素(共gap组)步长是gap
                for (int j = i - gap; j >= 0; j -= gap) 
                    if (arr[j] > arr[j + gap])//需要交换
                        temp = arr[j];
                        arr[j] = arr[j + gap];
                        arr[j + gap] = temp;
                    
                
            
        
        
        第一轮排序
        因为第一轮排序,是将10个数据分成了 10/2 = 5组
        //for (int i = 5; i < arr.length; i++) 
        //    //遍历各组中所有的元素(共5组,每组2个元素)
        //    for (int j = i - 5; j >= 0; j -= 5) 
        //        if (arr[j] > arr[j + 5])//需要交换
        //            temp = arr[j];
        //            arr[j] = arr[j + 5];
        //            arr[j + 5] = temp;
        //        
        //    
        //
        //System.out.println(Arrays.toString(arr));
        //
        第二轮排序
        5/2 = 2组
        //for (int i = 2; i < arr.length ; i++) 
        //    for (int j = i - 2; j >= 0; j -= 2) 
        //        if (arr[j] > arr[j + 2])//需要交换
        //            temp = arr[j];
        //            arr[j] = arr[j + 2];
        //            arr[j + 2] = temp;
        //        
        //    
        //
        //System.out.println(Arrays.toString(arr));
        //
        第三轮排序
         2/2 = 1组
        //for (int i = 1; i < arr.length; i++) 
        //    for (int j = i - 1; j >= 0; j -= 1) 
        //        if (arr[j] > arr[j + 1])//需要交换
        //            temp = arr[j];
        //            arr[j] = arr[j + 1];
        //            arr[j + 1] = temp;
        //        
        //    
        //
        System.out.println(Arrays.toString(arr));
    

5、移动法代码实现

效率高

    //移动法
    public static void shellSort2(int arr[]) 
        int temp = 0;
        for (int gap = arr.length / 2; gap > 0; gap /= 2) 
            //从第gap个元素,逐个对其所在的组进行直接插入排序
            for (int i = gap; i < arr.length; i++) 
                int j = i;
                temp = arr[j];
                if (arr[j] < arr[j - gap]) 
                    while (j - gap >= 0 && temp < arr[j - gap]) 
                        //移动
                        arr[j] = arr[j-gap];
                        j -= gap;
                    
                    //当退出while后,就给temp找到插入的位置
                    arr[j] = temp;
                
            

        
    

以上是关于Day564.希尔排序 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

希尔排序

希尔排序

希尔排序(shell‘ sort)

希尔排序

希尔排序 堆排序 归并排序

希尔排序带图4