
| 
	一、直接插入排序 
	整个区间被分为 
	有序区间 
	无序区间 
	每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入。 
	   public static void insertSort(int[] arr){ 
	        for (int i = 1; i < arr.length; i++) { 
	            int tmp = arr[i]; 
	            int j = i - 1; 
	            for ( ; j >= 0 ; j--) { 
	                if (arr[j] > tmp){ 
	                    arr[j + 1] = arr[j]; 
	                }else{ 
	                    //arr[j + 1] = tmp;//只要j回退的时候,遇到了比tmp小的元素,就结束了这次的比较 
	                    break; 
	                } 
	            } 
	            //j回退到了小于0的地方 
	            arr[j + 1] = tmp; 
	        } 
	    } 
	    public static void main(String[] args) { 
	        int[] array = {6,10,9,3,5}; 
	        insertSort(array); 
	        System.out.println(Arrays.toString(array)); 
	    } 
	} 
	输出结果: 
	时间复杂度:最好O(N)–>数据本身是有序的; 
	* 最坏O(N^2);–>数据逆序; 
	* 当一组数据,数据量不大且趋近于有序,此时用插入排序时间更快,越有序越快。 
	空间复杂度:O(1); 
	稳定性:稳定的排序; 
	一个稳定的排序可以实现为不稳定的排序,但是一个本身就不稳定的排序不可以变成稳定的排序。 
	二、希尔排序 
	希尔排序法又称缩小增量法。 
	希尔排序法的本质是插入排序,只不过是将待排序的序列按某种规则分成几个子序列,分别对几个子序列进行直接插入排序。这个规则就是增量,增量选取很重要,增量一般选序列长度一半,然后逐半递减,直到最后一个增量为1,为1相当于直接插入排序。 
	public static void shell(int[] arr,int gap){ 
	    for (int i = 1; i < arr.length; i++) { 
	        int tmp = arr[i]; 
	        int j = i - gap; 
	        for (; j >= 0 ; j-=gap) { 
	            if(tmp < arr[j]){ 
	                arr[j + gap] = arr[j]; 
	            }else{ 
	                break; 
	            } 
	        } 
	        arr[j+gap] = tmp; 
	    } 
	} 
	    public static  void shellSort(int[] arr) { 
	        int gap = arr.length; 
	        //增量在缩小,最后一组的增量为1 
	        while (gap > 1){ 
	            gap /= 2; 
	            shell(arr,gap); 
	        } 
	        shell(arr,1); 
	    } 
	    public static void main(String[] args) { 
	        int[] array = {9,1,2,5,7,4,8,6,3,5}; 
	        shellSort(array); 
	        System.out.println(Arrays.toString(array)); | 













