插入排序算法之直接插入排序

最簡單的排序算法之一是直接插入排序(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     }
View Code

算法複雜度:數據結構

因爲嵌套循環的每個都花費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(n2code

 

結論:一、N個互逆的數組的平均逆序數是N*(N-1)/4blog

           二、經過交換相鄰元素進行排序的任何算法平均都須要O(n*n)時間!!排序

參考文獻:《數據結構與算法分析》io

相關文章
相關標籤/搜索