並べ替えアルゴリズムの直接挿入、ヒル並べ替え、積み上げ順序の3つの比較

3508 ワード

最近また並べ替えアルゴリズムを研究しましたが、突然これらのアルゴリズムの多くはいくつかの基礎の上で行われた改善であり、時間や空間の複雑さを低減しました.今日lzは先に直接挿入して、ヒルの並べ替え、積み上げ並び替えの3つのアルゴリズムについてくどくど言います.
     まず一番簡単な直接挿入アルゴリズムについて説明します.           直接挿入:個人感覚の核心は臨時変数と角標の後に移動します.
           何も言わないで、先にコードを入れます.
      public static void main(String[] agrs){
		int[] arrs = new int[]{23,12,41,54,32,43,21};
		for(int i = 1;i0;j--){
				if(arrs[j-1] > temp){//    :                   
                                                     //                 ,    
                                 arrs[j] = arrs[j-1];
				}else{
					break;
				}
			}
                      //               
                     arrs[j] = temp;
		}
                     //b
                    for(int i : arrs){
			System.out.println(i);
		}
           }	
                  :12,21,23,32,41,43,54
      
ヒルの並べ替え:個人の感覚の核心は配列のグループと直接挿入です.
int[] arrs = new int[]{21,32,43,54,31,78,65,42};
		
		//    :           ,       (    )     
                 for(int i = arrs.length / 2; i >0 ; i = i / 2){
			
			//                      ,         
                        //        ,         arrs[0],       j
                        // j  0+i,           arrs[1],     1+i
                        //         j     i,   ++
                         for(int j = i; j    
                           //            -i         
                          //               ,     i      ,     
                          //          ,     p=p-i,p>=i(i   0,            )
                                    for(p = j ; p >= i ;p = p-i){
					if(temp < arrs[p - i]){
						arrs[p] = arrs[p - i];
					}else{
						break;
					}
					
				}
				arrs[p] = temp;
			}
                               //b
                      }
        積み上げ順序:中心点--
積み重ねられた構造、
トップデータ交換
               int[] arrs = new int[]{32,21,54,88,64,32,43,54,76,87,98,8723};
		
		//n       ,             
		//                   ,            
		//    ,                ,    ,               
            ,         ,        
                //           ,        ,              ,   ,   
   ,   for          ,create     ,          ,      root    
   ,           
                  for(int n = arrs.length/2 - 1;n>=0;n--){//length*2+1         ,    +1
			create(arrs,n,arrs.length);
		}
		for(int i = arrs.length-1; i>0 ; i--){
			getMax(arrs, i);
		}
		
		
		for (int i : arrs) {
			System.out.print(i+"_");
		}
public static void create(int[] arrs, int root, int all){
		int m = 2*root+1;
		
		//        
		if(m
public static void getMax(int[] arrs, int all){
		//           
		int temp = arrs[all];
		arrs[all] = arrs[0];
		arrs[0] = temp;
		
		//        ,       ,           ,             
           ,                 
               create(arrs, 0, all);
		
	}
       前の2つのアルゴリズムa以上のforサイクルは、配列データを挿入するデータセットを継続的に取得し、このforは配列パケットが終了した後の各配列の中間データの挿入に相当すると理解できます.まとめて積み上げると挿入が必要なデータです.
       a-->bからは、挿入操作を行うコードです.ヒル順序と直接挿入はわずかな違いがあります.もちろん、i=0の場合は同じです.ただし、山の中では直接挿入ではありませんが、思想は変わりません.一つの数で他の数と比較して、小さいままであれば、大きいものはノード交換して、上に進めます.本格的なinsertの場合は、insertは直接最後のヒープノードの後にノードを追加して前進していくので、より分かりやすいです.
      挿入のアルゴリズムについては、まずここにまとめます.興味のある友達はお互いに交流してもいいです.