算法与数据结构—插入排序
算法思路
例如:给定一个无序数组int arr={1,3,2,6,9}; n代表集合数组的长度,给出一个算法将数组arr按照从小到大的顺序进行排列。
插入排序:看当前位置i的值是否比它前一个数小,如果小就与前面的数交换位置。
代码
public static void insertionSort(int[] arr,int n){
//插入排序中数组的开始默认是有序的。
for(int i=1;i<n;i++){
/*寻找元素arr[i]合适的插入位置,这里使用j>0而不是j>=0是因为每一次都是把
当前位置的元素和前一个位置的元素进行交换,所以最后发生的位置是j=1的时候*/
for(int j=i;j>0&&(arr[j]<arr[j-1]);j--){
//考察的是当前元素是否比前一个元素的值要小,yes交换位置
swap(arr,j,j-1)
}
}
}
public static void insertionSortPro(int[] arr,int n){
//使其在内层循环只交换一次
for(int i=1;i<n;i++){
//先把要考察的当前元素由e来保存一个副本
int e=arr[i];
int j;
//如果arr[j - 1] > e说明不是我们要找的最终位置
for(j=i;j>0&&(e<arr[j-1]);j--){
//向后移位
arr[j]=arr[j-1]
}
arr[j]=e;
}
}
public static void swap(int[] arr,int a,int b){
int temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
时间复杂度
1.插入排序与选择排序的最大区别在于插入排序可以提前结束循环查找。而选择排序是每次都需要进行全数组扫描。
2.对于insertionSort算法来说,它的时间复杂度为O(n^2),并且效率要比同为O(n^2)的选择排序还要慢,是因为在比较的同时,程序还在不停的做swap(arr,j,j-1)交互,交互要比比较更加耗时。
3.对于insertionSortPro算法,它优化的核心思想在于使内层循环只交换一次。当e