文章目录
- 一、简介
- 二、算法思路分析
- 三、算法复杂度分析:
- 3.1、时间复杂度方面:
- 3.2、空间复杂度方面:
- 四、代码实现:
一、简介
插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,该算法适用于少量数据的排序。在插入排序中,每一个元素都会插入到已经排序的序列中,通过比较和移动元素来达到排序的目的。
二、算法思路分析
插入排序的关键在于:要理解何为插入,现有一随机数组arr = [4,7,5,3,6],对其进行排序。首先忘掉这是一个数组,扑克牌大家都玩过吧,以扑克牌举例,假设扑克牌的排序从左至右依次变大
第一手: 取到:4,手中就一张牌,结束
第二手: 取到:7,当前手中牌:【4】,对比: 4 < 7 直接4右边,结束
第三手: 取到:5,当前手中牌:【4、7】,对比: 7 > 5,7向右移动一位,给左边留个插牌的位 置,再对比:4 < 5,插到4的右一位。
第四手: 取到:3,当前手中牌:【4、5、7】,对比:7 > 3,7向右移动一位,给左边留个插牌的位置,再对比:5 》3,5向右移一位(7后移留下的位置),给左边留个插牌的位置,再对比:4>3,4向右移一位,4左边没牌了那就放在最左边。
第五手: 取到:6,当前手中牌【3、4、5、7】,对比:7 》6, 7向右移动一位,给左边留个插牌的位置,再对比:5 < 6,插到5的右一位。
至此手中的扑克牌变成【3、4、5、6、7】
三、算法复杂度分析:
3.1、时间复杂度方面:
最好情况时间复杂度:当待排序序列已经是有序时,每次插入一个元素只需要进行一次比较即可确定其位置,因此最好情况下的时间复杂度为O(n)。
最坏情况时间复杂度:当待排序序列是逆序的,即每个元素都比前一个元素大,这时每次插入一个元素需要进行多次比较才能找到正确的位置,最坏情况下的时间复杂度为O(n^2)。
平均情况时间复杂度:由于插入排序在最好和最坏情况下的时间复杂度分别对应于序列已有序和序列完全逆序的情况,因此在实际应用中,其平均时间复杂度也是O(n^2)。
3.2、空间复杂度方面:
插入排序是一种就地排序算法,它不需要额外的存储空间来排序数据,因此其空间复杂度为O(1)。这意味着它在处理数据时不会占用额外的存储空间,非常适合处理数据量较小的情况。
四、代码实现:
public static void insertSort(int[] pokerArr) {
for ( int i = 1; i < pokerArr.length; i++ ) {
//当前取到的牌
int newPoker = pokerArr[i];
int j = i - 1;
//与手中牌对比,确定插入位置
while ( j >= 0 && pokerArr[j] > newPoker ) {
//手中第j张牌 > 当前取的牌 当第j张牌右移一位
pokerArr[j + 1] = pokerArr[j];
//再对比左边的牌,直到左边无牌、或者左边牌 < 当前取的牌,结束
j--;
}
//将牌插入最终位置
pokerArr[j+1] = newPoker;
}
}