• 排序算法之希尔排序


    1、基本思想

      在要排序的一组数中,按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

    2、代码示例

    package  sort;
    
    /**
     * 希尔排序(最小增量排序) 
     *
     */
    public class ShellSort {
        
        public void TestSort() {
            int a[]={1,54,6,3,78,34,12,45,56,100}; 
            sort(a);
            sort2(a);
        }
        
        public void sort(int arr[]){ 
            //数组长度
            int len=arr.length; 
            //临时变量
            int temp=0; 
            //增量d(n/2,n为要排序数的个数)
            int d=len;
            while(true){
                d=d/2;
                //直接插入排序
                for(int k=0;k<d;k++){  
                    for(int i=k+d;i<len;i+=d){  
                        int j=i-d;  
                        temp=arr[i];  
                        for(;j>=0&&temp<arr[j];j-=d){  
                            arr[j+d]=arr[j];  
                        }  
                        arr[j+d]=temp;  
                    }  
                } 
                if(d==1){
                    break;
                }
            }  
            for(int i=0;i<len;i++){
                System.out.print(arr[i]+" ");  
            }
        } 
        
        public void sort2(int arr[]){ 
            //数组长度
            int len=arr.length; 
            int i, j, gap;
            for (gap = len / 2; gap > 0; gap /= 2) {//步长
                for (i = 0; i < gap; i++)        //直接插入排序
                {
                    for (j = i + gap; j < len; j += gap) 
                        if (arr[j] < arr[j - gap])
                        {
                            int temp = arr[j];
                            int k = j - gap;
                            while (k >= 0 && arr[k] > temp)
                            {
                                arr[k + gap] = arr[k];
                                k -= gap;
                            }
                            arr[k + gap] = temp;
                        }
                }
            }
            for (i = 0; i < arr.length; i++){
                System.out.print(arr[i] + " ");
            }
        }
    }

    3、效率分析

  • 相关阅读:
    CF1442E. Black, White and Grey Tree
    CF1442D. Sum
    CF1444D. Rectangular Polyline
    arc107F
    外心与垂心关系
    CF1434E. A Convex Game
    CF1434D. Roads and Ramen
    arc106E
    arc106F
    CF704E. Iron Man
  • 原文地址:https://www.cnblogs.com/hehaiyang/p/4754729.html
Copyright © 2020-2023  润新知