2. 插入排序
思想
将数组分为排序和未排序两部分,每次从未排序部分选取一个元素,按顺序插入到已排序部分。
想象你打牌的时候,手上拿的是已排序的拍,每次抓牌的时候,都是把抓到的牌(未排序)按顺序插入到手上已排序的牌中。
插入的策略,交换相邻元素或者移动插入。每进行一个相邻交换,逆序对减一。
实现
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] nums = {5, 12, 5, 7, 1, 4, 7, 8, 9};
insertSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void insertSort(int[] nums){
for (int i = 1; i < nums.length; i++) {
int insert_value = nums[i];
for (int j = i; j >= 1; j--) {
if(nums[j-1]>insert_value) nums[j] = nums[j-1];
else{
nums[j] = insert_value;
break;
}
}
}
}
}
复杂度
时间复杂度:选取未排序元素的时间为常数,所以需要确认将其插入到排序元素中的时间。(这是关键)每交换相邻元素,逆序对会减一,所以插入到排序元素的时间跟逆序对成正比。
所以,可以很容易得出,最坏时间复杂度为(n-1)n/2,平均时间复杂度为(n-1)n/4,最好时间复杂度为1