插入排序:排序算法简单排序入门必学排序之一。
排序原理:
1.把所有的元素分为两组,已经排序的和未排序的;
2.找到未排序的组中的第一个元素,向已经排序的组中进行插入;
3.倒序遍历已经排序的元素,依次和待插入的元素进行比较,直到找到一个元素**小于等于待插入元素,那么就把待插入元素放到这个位置,其他的元素向后移动一位;
算法图示:
代码实现:
public static void insertSort(int []arr){
for(int i=1;i<arr.length;i++){
for(int j=i-1;j>=0 && arr[j]>arr[j+1];j--){
swap(arr,j,j+1);
}
}
}
public static void swap(int []arr,int i,int j){
int temp = arr[i];
arr[i] =arr[j];
arr[j] = temp;
}
API实现:
package 排序类算法;/* *@Author:Tstr *@Date:2020/8/15 21:48 *@from:lenovo *@e-mail:x20135201314boy@126.com */
public class MyInsertionSort {
//排序核心
public static void Sort(Comparable[] a){
for (int i = 1; i <a.length ; i++) {
for (int j = i; j >0; j--) {
if (compare(a[j-1],a[j])) {
swop(a,j-1,j);
}else{
break;
}
}
}
}
//比较相邻元素大小关系
public static boolean compare(Comparable x,Comparable y){
return x.compareTo(y)>0;//既是x>y
}
//元素交换
private static void swop(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
测试:
package 排序类算法;/* *@Author:Tstr *@Date:2020/8/15 21:58 *@from:lenovo *@e-mail:x20135201314boy@126.com */
import java.util.Arrays;
public class MyInsertionTest {
public static void main(String[] args) {
Integer[] testarr = {
4,6,8,7,9,2,10,-1};
MyInsertionSort.Sort(testarr);
System.out.println(Arrays.toString(testarr));
}
}
结果展示:
复杂度分析:
插入排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,我们分析插入排序的时间复杂度,主要分析一下内层循环体的执行次数即可。
最坏情况,也就是待排序的数组元素为{12,10,6,5,4,3,2,1},那么:
比较的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)(N-1)/2=N^2/2-N/2;
交换的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)(N-1)/2=N^2/2-N/2;
总执行次数为:
(N2/2-N/2)+(N2/2-N/2)=N^2-N;
按照大O推导法则,保留函数中的最高阶项那么最终插入排序的时间复杂度为O(N^2).
PS:自此,经典排序算法中复杂度相同为O(n^2)的排序就结束了,之后将更新高级排序算法。
声明:文中涉及图片来自网络,如有侵权,请联系博主删除!