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

最简单的排序算法之一是直接插入排序(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)!

 

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)时间!!

参考文献:《数据结构与算法分析》

 

posted @ 2018-08-08 20:49  随心—所欲  阅读(1286)  评论(0编辑  收藏  举报