Java的插入排序是属于比较常用的排序,插入排序与选择排序相比,插入排序在第二重循可以提前结束(满足一定条件即可),理论上效率要比选择排序高。
我们有必要学习插入排序吗?
插入排序是属于时间复杂度为O(N^2)在排序一些几乎有序的数组的时甚至会比时间复杂度为O(NlogN)更快。
下面来看一下我所写的插入排序算法
基本思想:把第二个数与前一个数做比较,小于前面的数就替换,以此类推。
插入排序一:
package SF;
public class InsertSort {
private InsertSort() {
}
public static void sort(int [] arr) {
int n =arr.length;
for(int i=1;i<n;i++) {
for (int j=i;j>0&&arr[j]<arr[j-1];j--)
swap(arr,j);
}
}
public static void swap(int [] arr,int j) {
int t =arr[j-1];
arr[j-1]=arr[j];
arr[j]=t;
}
public static void main(String[] args) {
int [] arr = {9,8,7,6,5,4,3,2,1,0};
InsertSort.sort(arr);
for (int i=0;i<arr.length;i++) {
System.out.print(arr[i]);
System.out.print(" ");
}
}
}
插入排序一用到元素的交换,元素的交换是非常耗费时间的,这里数据少可能看不出来,但数据多就可以比较明显的看出来,我们可以对此进行改进,下面来看一下插入排序二。
基本思想:先把第二个数复制出来,与前一个数做比较,小于的话就把第一个数赋给第二个数,然后先前复制的数赋给第一个,以此类推。
插入排序二
package SF;
public class InsertSort1 {
private InsertSort1() {
}
public static void sort( int [] arr) {
for(int i =1;i<arr.length;i++) {
int a =arr[i];
int j;
for( j=i;j>0&&arr[j-1]>a;j--) {
arr[j]=arr[j-1];
}
arr[j]=a;
}
}
public static void main(String[] args) {
int [] arr= {9,8,7,6,5,4,3,2,1};
InsertSort1.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);;
System.out.print("");
}
}
}
总结
与插入排序一相比,改进后的插入排序二代码以赋值代替元素的交换swap可以大大增加排序的速度,其次,它的代码也更加简洁。