堆排序和shell排序

近來很熱啊,菜鳥準備放水了。在寫一篇夏雨的腦洞文,喜歡雨。

相關(guān)的原理與細節(jié),看視頻,我講不清楚了,汗啊。

python03-05-05希爾排序
計算機科學9.2&9.3希爾排序與堆排序(浙江大學陳越、何欽銘

概念嘛,百度百科
堆排序
Shell排序

堆的形狀如下

堆.jpg

采用大根堆,根結(jié)點從0開始,其左兒子為2i+1,右兒子為2i+2, 在[0,(n-1)/2]之間循環(huán)建立堆。

相關(guān)的code

package day20180728;

public class DuiSort {
    
    /**
     * 
    建大根堆的函數(shù)。
    
     */
    public static void heap(int[] arr,int k,int n){
        
        int i=k,j=2*i+1;
        
        while(j<n) //篩選進行到葉子的判別方法。
        {
    
            if(j<n-1&&arr[j]<arr[j+1])
            {
                j=j+1;  
            }
            
            if(arr[i]<arr[j])
            {
                int temp=arr[j];
                arr[j]=arr[i];
                arr[i]=temp;
                i=j;
                j=2*i+1;
            }else {
                break;
            }   
        }
        
    }
    

    public static void heapSort(int[] arr,int n)
    {
        int temp,i=0;
         for(i=(n-1)/2; i>=0; i--)
         {
             heap(arr,i,n);
             display(arr);
         }
        
         for(i=1; i<n; i++)
         {
             temp=arr[0];
             arr[0]=arr[n-i];
             arr[n-i]=temp;
             heap(arr,0,n-i);  
             System.out.println("第"+i+"建堆的情況:");
             display(arr);
         }
        
    }
    
    public static void display(int[] arr)
    {
        for(int i:arr)
        {
            System.out.print(i+" ");
        }
        System.out.println();
        
    }

    public static void main(String[] args) {
        
        
        int[] arr= {11,6,8,666,-5,33,88,6};
        
        heapSort(arr,arr.length);
        

    }

}

結(jié)果如下

11 6 8 666 -5 33 88 6 
11 6 88 666 -5 33 8 6 
11 666 88 6 -5 33 8 6 
666 11 88 6 -5 33 8 6 
第1建堆的情況:
88 11 33 6 -5 6 8 666 
第2建堆的情況:
33 11 8 6 -5 6 88 666 
第3建堆的情況:
11 6 8 6 -5 33 88 666 
第4建堆的情況:
8 6 -5 6 11 33 88 666 
第5建堆的情況:
6 6 -5 8 11 33 88 666 
第6建堆的情況:
6 -5 6 8 11 33 88 666 
第7建堆的情況:
-5 6 6 8 11 33 88 666 

shell排序

就是改變增量的插入排序,這里增量采用n/2遞歸到0,

相關(guān)的code

package day20180728;

public class ShellSort {
    
    public static void shell(int[] arr,int k)
    {
        
        for(int i=k; i<arr.length; i=i+1)
        {
            
               int temp=0;
                temp=arr[i];
                int m=i-k;  
                 //這里的判斷index是坑,先判斷它,不然會下標越界。
                while(m>=0&&arr[m]>temp)
                {
                    arr[m+k]=arr[m];
                     m=m-k; 
                }
                if(m!=i)
                    arr[m+k]=temp;
            
            System.out.println("第"+i+"次結(jié)果");
            display(arr);
            
        }
        
    }

public  static void  shellSort(int[] arr)
{
    for(int k=arr.length/2; k>0; k=k/2)
        shell(arr,k);
}
    
    public static void display(int[] arr)
    {
        for(int i:arr)
        {
            System.out.print(i+" ");
        }
        System.out.println();
        
    }
    

    public static void main(String[] args) {
    
        int[] arr= {11,6,8,666,-5,33,88,6};
        display(arr);
        
        shellSort(arr);
        
        display(arr);
        

    }

}

結(jié)果

11 6 8 666 -5 33 88 6 
第4次結(jié)果
-5 6 8 666 11 33 88 6 
第5次結(jié)果
-5 6 8 666 11 33 88 6 
第6次結(jié)果
-5 6 8 666 11 33 88 6 
第7次結(jié)果
-5 6 8 6 11 33 88 666 
第2次結(jié)果
-5 6 8 6 11 33 88 666 
第3次結(jié)果
-5 6 8 6 11 33 88 666 
第4次結(jié)果
-5 6 8 6 11 33 88 666 
第5次結(jié)果
-5 6 8 6 11 33 88 666 
第6次結(jié)果
-5 6 8 6 11 33 88 666 
第7次結(jié)果
-5 6 8 6 11 33 88 666 
第1次結(jié)果
-5 6 8 6 11 33 88 666 
第2次結(jié)果
-5 6 8 6 11 33 88 666 
第3次結(jié)果
-5 6 6 8 11 33 88 666 
第4次結(jié)果
-5 6 6 8 11 33 88 666 
第5次結(jié)果
-5 6 6 8 11 33 88 666 
第6次結(jié)果
-5 6 6 8 11 33 88 666 
第7次結(jié)果
-5 6 6 8 11 33 88 666 
-5 6 6 8 11 33 88 666 

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,518評論 0 1
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,821評論 0 15
  • 你有沒有一個明知道不會得到卻還是會始終對她好下去的人。
    阿拉斯加2閱讀 50評論 0 0
  • “孤影碎,沉香醉,江里紅妝又幾回。殘燭微冷珠簾脆,歸雁不歸,了卻心事,濁酒空幾杯? 紅葉飛,花易淚,寒花未落何傷悲...
    千殤白狐閱讀 279評論 0 0
  • 今天夏令營的老師讓我們找十張照片發(fā)到郵箱制作成長相冊。于是,我把QQ空間專屬于你的成長照片花兩個多小時翻看了一遍。...
    利雅家三公主閱讀 681評論 3 0

友情鏈接更多精彩內(nèi)容