插入排序法:
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)
。是稳定的排序方法
。
下面是代码实现
/**
* @Project: dataStructure
* @description: 插入排序
* @author: sunkang
* @create: 2018-08-19 22:00
* @ModificationHistory who when What
**/
public class InsertSort {
/**
* 插入排序
* 核心思想:把关键字插入到已经排序好的数组中
*
* 对于少量元素的排序,插入排序是一个有效的算法
*
* 由于前面的分析算法的时候
*
* 插入排序的最好的情况时间复杂度为: Θ(n)
* 插入排序的最坏的情况时间复杂度为: Θ(n^2)
* @param arr
* @return
*/
public Integer[] insertSort(Integer[] arr){
for( int i = 1;i<arr.length;i++){
Integer key = arr[i];
int j = i-1;
while( j>=0 && arr[j] > key){
arr[j+1] = arr[j];
j--;
}
arr[j+1] = key;
}
return arr;
}
public void display(Integer[] arr){
for(Integer in:arr){
System.out.print(in+",");
}
System.out.println();
}
public static void main(String[] args) {
Integer[] arr = new Integer[]{1,2,7,4,3,9};
InsertSort insertSort = new InsertSort();
Integer[] newArr = insertSort.insertSort(arr);
insertSort.display(newArr);
}
}
思考题:
假设A[1...n]是一个有n个不同的数组,若i<j,且A[i]>A[j],则对偶(i,j)称为A的一个逆序对。
1、列出数组(2,3,8,6,1)的5个逆序对?
2、请问插入排序的运行时间与输入数组中逆序对的数量的之间是什么关系?证明你的回答?
答案
1、⟨2,1⟩, ⟨3,1⟩, ⟨8,6⟩, ⟨8,1⟩ and ⟨6,1⟩.
2、已经知道有序的情况最好的时间复杂度为Θ(n),比如上面序列中跟6有关的逆序对有⟨8,6⟩,⟨6,1⟩,如果要插入6,那么要插入在8的前面,此时已经比较了一次了,再看看1的有序对有关的有⟨2,1⟩, ⟨3,1⟩, ⟨8,1⟩,⟨6,1⟩,也就是1插入到最前面的位置需要进行四次比较和移动,说明 运行时间跟逆序对成线性关系,则插入排序的运行时间为: Θ(n+d),其中d为逆序对,n为数组的个数