插入排序算法之直接插入排序
最简单的排序算法之一是直接插入排序(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)!
2、冒泡排序 冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数 放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较 (因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个 数),将小数放前中,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟 结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
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)
结论:1、N个互逆的数组的平均逆序数是N*(N-1)/4
2、通过交换相邻元素进行排序的任何算法平均都需要O(n*n)时间!!
参考文献:《数据结构与算法分析》