插入排序(稳定)
算法思想
每次将待排序区间的第一个元素按照大小插入到已排序区间的合适位置中,直到所有的元素有序。
时间复杂度
- 最好情况:O(n)
- 最坏情况:O(n^2)
- 平均复杂度:O(n^2)
实现思路
给定一个待排序数组,元素个数为size,定义一个变量i用于区分已排序区间和未排序区间,[0.i)表示已排序数组,[i,size)表示未排序数组,定义一个value用于保存待排序区间中需要插入的值,在已排序区间中,从后向前寻找合适插入value的位置,一边寻找一边搬移元素,直到未排序区间元素为空。
以arr[4] = {8,6,3,5}:
根据插入排序的思想,先定义好已排序与未排序区间的边界i,由于是将未排序元素插入到已排序好的区间中,故将i置为1比较合适,因为含有一个元素的区间就是以排序好的区间。此时i=1,已排序区间为[0,i),未排序区间[i,size)。再将未排序区间中首元素与已排序区间中的所有元素array[j]一一比较后找到合适的插入位置处,直到未排序区间为空即表示数组排序完毕。
第一次插入:边界i = 1,已排序区间为[0,1),未排序区间[1,size),将待插入元素array[i] = array[1] = 5保存在value中,并在已排序区间[0,1)中寻找value的合适位置,一边寻找一边进行搬移。
j 开始在已排序区间[0,1)中寻找(寻找结束条件为j <= 0或找到小于value的位置):
1.j = i = 1,由于array[j - 1] = array[0] = 8 > value = 6,故将array[j - 1] = array[0]搬运到array[j] = array[1]中,数组变为array = {8,8,2,7}
2.j–即j = 0,由于j <= 0故寻找结束,将value插入到j = 0处,即array[j] = value。此时已排序区间增加1,故i = i + 1=2。数组变为array = {6,8,3,5}
第二次插入:边界i = 2,已排序区间为[0,2),未排序区间[2,size),将待插入元素array[i] = array[2] = 3保存在value中,并在已排序区间[0,2)中寻找value的合适位置,一边寻找一边进行搬运。
cur开始在已排序区间[0,2)中寻找(寻找结束条件为j <= 0或找到小于value的位置):
1.j = i = 2,由于array[j - 1] = array[1] = 8 > value = 3,故将array[j - 1]=array[1]搬运到array[j] = array[2]中,数组变为array = {6,8,8,5}
2.j–即j = 1,由于array[j - 1] = array[0] = 6 > value = 3,故将array[j - 1]=array[0]搬运到array[j] = array[1]中,数组变为array = {6,6,8,5}
3.j–即j = 0,由于j <= 0故寻找结束,插入位置为j = 0,故将value插入到j = 0处,即array[j] = value。此时已排序区间增加1,故i = i + 1 = 3。数组变为array = {3,6,8,5}
第三次插入:边界i = 3,已排序区间为[0,3),未排序区间[3,size),将待插入元素array[i] = array[3] = 5保存在value中,并在已排序区间[0,3)中寻找value的合适位置,一边寻找一边进行搬运。
j开始在已排序区间[0,3)中寻找(寻找结束条件为j <= 0或找到小于value的位置):
1.j = i = 3,由于array[i - 1] = array[2] = 8 > value = 5,故将array[j - 1] = array[2]搬运到array[j] = array[3]中,数组变为array = {3,6,8,8}
2.j–即j = 2,由于array[j - 1] = array[1] = 6 > value = 5,故将array[j - 1] = array[1]搬运到array[j] = array[2]中,数组变为array = {3,6,6,8}
2.j–即j = 1,由于array[j - 1] = array[0] = 3 < value = 5,故找到了插入的位置寻找结束。将value插入到j = 1处,即array[1] = value=5,此时已排序区间增加1,i = i + 1 = 4。数组变为array = {3,5,6,8}
第四次插入:由于此时i = 4 >= size,故整个数组元素插入完成,即插入排序结束!已排序的数组为array = {3,5,6,8}
代码实现
package Sort;
public class InsertSort {
public static void insertSort(int[] arr,int size){
if(size <= 1){
return;
}
for(int i = 1;i < size;i++){
int value = arr[i];
int j = i;
for(;j > 0;j--){
if(arr[j - 1] > value){
arr[j] = arr[j - 1];
}else{
break;
}
}
arr[j] = value;
}
}
public static void main(String[] args) {
int[] arr = {8,6,3,5};
insertSort(arr,4);
for(int i:arr){
System.out.print(i + " ");
}
}
}