插入排序
思想:
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
package com.tangbaobao.sort;
import org.junit.Test;
import java.util.Arrays;
public class InsertSort {
@Test
public void fun1(){
int[] arr = {1,2,5,6,8,4};
int[] ints = this.insertSort(arr);
System.out.println(Arrays.toString(ints));
}
/**
* 插入排序
*
* @author 唐学俊
* @create 2018/03/08
*
* 插入排序的思想
* 1.遍历数组中的数,直到找到一个比它前面还要小的数在数组的i位置
* 2.遍历数组从0到i,直到i比他大的数,记作k
* 3.将k到i-1的数依次往后移动,然后把i插入进入
* @param arr
* @return
*/
public int[] insertSort(int[] arr){
for(int i = 1;i<arr.length;i++) {
if (arr[i] < arr[i - 1]) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[i]) {
int temp = arr[i];
for (int k = i - 1; k >= j; k--) {
arr[k + 1] = arr[k];
}
arr[j] = temp;
break;
}
}
}
}
return arr;
}
}
第一种排序方式:时间复杂度:o(n)³
上述算法用到了三次循环,显然不是最优的,我们可以将依次比较和向后移动放在一个循环
/**
* 优化之后的插入排序
* 将中间的j循环去掉,边找边移动目标数字
*/
public int[] insertSort2(int arr[]){
for(int i = 1;i<arr.length;i++){
if(arr[i]<arr[i-1]){
int temp = arr[i];
for(int j = i-1;j>0;j--){
if(arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
return arr;
}
时间复杂度为o(n)²