【2019春招準備:8.並べ替え】

18721 ワード

【内容】【補足】
  • 時間複雑度
  • ソート方法
    時間の複雑さ
    あんていせい
    きゅうそくれつ
    N log(N)
    スタック
    N log(N)
    ふあんてい
  • 速排の2つの理解構想:単回交換法と二回交換法
  • package q3_sort;
    import java.util.Scanner;
    /**
     *      (NlogN)
     * @author ziboris
     * @date 2018 11 26    9:37:04
     *
     */
    public class Test1_QuickSort {
    	public static void quick_sort(int[] a, int left, int right) {
    		if (left < right) {
    			// i,j        x           
    			int i = left, j = right, x = a[left];
    			while (i < j) {//     while      while        
    				while (i < j && a[j] >= x)
    					j--; // i j      ,         while   ;x      i       
    				//           
    				if (i < j)
    					a[i++] = a[j];
    				while (i < j && a[i] < x)
    					++i;
    				if (i < j)
    					a[j--] = a[i];
    			}
    			//        i==j
    			a[i] = x;
    			quick_sort(a, left, i - 1);
    			quick_sort(a, i + 1, right);
    		}
    	}
    	public static void main(String[] args) {
    
    		Scanner scanner = new Scanner(System.in);
    		int n = scanner.nextInt();
    		int[] a = new int[n];//             
    
    //		System.out.println(a.length);
    		for (int i = 0; i < n; ++i) {
    			a[i] = scanner.nextInt();
    		}
    		quick_sort(a, 0, a.length - 1);
    		for (int i : a) {
    			System.out.println(i);
    		}
    	}
    }
    
  • スタック並べ替え完全二叉木:スタック(従って配列で表すことができる下標は1からそうでないと魔性である)大頂スタック小頂スタック
  • 1−n n/2は最後の非リーフノードの下付き
    package q3_sort;
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Test2_HeapSort {
    	static int n = 10;
    	static int[] a = new int[11];//             ;
    
    	public static void downAdjust(int low, int high) {
    		int i = low;
    		int j = i * 2;
    		while (j <= high) {
    			//         
    			if (j + 1 <= high && a[j + 1] > a[j])
    				j = j + 1;//         ij           j                  
    			
    			//                   ,           
    			if (a[i] < a[j]) {
    				int temp = a[j];
    				a[j] = a[i];
    				a[i] = temp;
    				i = j;
    				j = j * 2;
    			} else {
    				break;
    			}
    		}
    	}
    
    	public static void heap_sort() {
    //		create_heap();	
    		for (int i = n / 2; i >= 1; --i) {
    			downAdjust(i, n);
    		}
    
    //		sort
    		for (int i = n; i > 1; --i) {
    			int temp = a[1];
    			a[1] = a[i];
    			a[i] = temp;
    			downAdjust(1, i - 1);
    		}
    	}
    
    	public static void main(String[] args) {
    		
    //		72 6 57 88 60 42 83 73 48 85
    		Scanner scanner = new Scanner(System.in);
    		n = scanner.nextInt();
    
    //		System.out.println(a.length);
    		//         1         
    		for (int i = 1; i <= n; ++i) {
    			a[i] = scanner.nextInt();
    		}
    
    		heap_sort();
    
    		System.out.println(Arrays.toString(a));
    	}
    }