最簡單的排序算法之一是直接插入排序(insertion sort)。插入排序由N-1趟排序組成,對於p=1到N-1趟,插入排序保證從位置0到位置p上的元素爲已排序狀態,插入排序利用了這樣的事實:已知位置0到位置p上的元素處於已經排過序的狀態,下圖顯示了一個數組樣例在每一趟插入排序的狀態:算法
在第p趟,咱們把p上的元素向左移動,知道它在前p+1個元素的正確位置被找到爲止:數組
1 private static void directInsertSort(int[] array) { 2 for (int i = 1; i < array.length; i++) { 3 for (int j = 0; j < i; j++) { 4 if (array[i] < array[j]) { 5 int temp = array[i]; 6 // System.arraycopy(array,j,array,j+1,i-j); 7 array[i] = array[j]; 8 array[j] = temp; 9 } 10 } 11 12 } 13 }
1 public static void insertSort(int [] array){ 2 int j; 3 for (int i=1;i<array.length;i++){ 4 int temp=array[i]; 5 for (j=i;j>0&&temp<array[j-1];j--) 6 array[j]=array[j-1]; 7 array[j]=temp; 8 } 9 }
算法複雜度:數據結構
因爲嵌套循環的每個都花費N次迭代,所以插入排序爲O(n2),固然若是輸入的數據是已經預先排序的,那麼時間複雜度就爲O(N)!ide
二、冒泡排序 冒泡排序(BubbleSort)的基本概念是:依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟:首先比較第1個和第2個數,將小數放前,大數 放後。而後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此第一趟結束,將最大的數放到了最後。在第二趟:仍從第一對數開始比較 (由於可能因爲第2個數和第3個數的交換,使得第1個數再也不小於第2個 數),將小數放前中,大數放後,一直比較到倒數第二個數(倒數第一的位置上已是最大的),第二趟 結束,在倒數第二的位置上獲得一個新的最大數(其實在整個數列中是第二大的數)。如此下去,重複以上過程,直至最終完成排序。spa
1 public static void bubbleSort(int[] arr){ 2 for (int i=0;i<arr.length-1;i++){ 3 for (int j=0;j<arr.length-1-i;j++){ 4 if (arr[j]>arr[j+1]){ 5 int temp=arr[j]; 6 arr[j]=arr[j+1]; 7 arr[j+1]=temp; 8 } 9 } 10 } 11 }
時間複雜度與插入排序同樣爲O(n2)code
結論:一、N個互逆的數組的平均逆序數是N*(N-1)/4blog
二、經過交換相鄰元素進行排序的任何算法平均都須要O(n*n)時間!!排序
參考文獻:《數據結構與算法分析》io