插入排序
插入排序
基本思想
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 [1] 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动
实现步骤
思想1:可将插入排序看作是整理手中的扑克牌,刚开使手中拿着一张牌,之后取到的牌与手中的比较找到合适的位置(大的放后面,小的放前面)
思想2:将n个待排序的数看作是一个有序表和一个无序表,起始有序表中只有一个数,将无序表中的数依次取出有序的插入有序表中
1,将无序表中拿到的数插入有序表时,默认插入的下标为有序表的最后一个位置(index),
2,将待插入数据与有序表的最后一个位置的数进行比较,大于则找到要插入的位置(index+1);
3,否则,待插入数据将插入有序表中间,将有序表的最后一个位置的数进行后移,为待插入腾位置,
4,此时(index--),将待插入数据与有序表的倒数第二个位置的数进行比较,重复(2-3)步骤。
5,若有序表中的所有数据都大于待插入的数据,即当index<0;找到要插入的位置(index+1);
代码实现
public static int[] sort(int[] arr){
for(int i=1;i<arr.length;i++){
int index=i-1;//待插入下标
int insertValue=arr[i];//待插入元素
while(index>=0 && insertValue<arr[index]){//待插入下标大于等于零;待插入元素小于待插入下标的话,进入循环
arr[index+1]=arr[index];//让位,将此位置的元素后移,位置让给待插入元素。
index--;//一轮比较完成后,待插入下标-1继续进行循环比较
}
arr[index+1]=insertValue;//由于上面index--,故此时的待插入下标为index+1;
}
return arr;
}
复杂度与稳定性
稳定性:若数组中出现重复元素,若排序后重复元素还按照源数组中的先后顺序排列,则称之为稳定,否则为不稳定
in-place:不占用额外内存
n:数据规模
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | In-place | 稳定 |