我们接着上篇文章的冒泡排序来写插入排序
1.3 插入排序
插入排序的基本思想:
在待排序的记录序列中选取一个记录插入到前面已经排好序的记录序列的适当位置
如此反复,知道所有待排序记录全部插完
基本思想
已知记录数组r[n+1],在排序的中间某一时刻,记录数组分为两部分:
r[1],r[2],……r[i-1]为有序,而r[i],……,r[n+1]为无序,直接插入排序 将从无序区中选取第一个记录(r[i])插入到有序区的适当位置,使得r[1],…,r[i]为新的有序区。
稳定性
该排序方法是稳定的
时间复杂度
直接插入排序和初始状态有很大的关系
最好情况是文件初态为正序,此时算法的时间复杂度为O(n)。
最坏情况是文件初态为反序,时间复杂度为O(n2).
平均时间复杂度也是O(n2).空间复杂度S(n)=O(1).
代码®:
insertSort <- function(arrayy) {
n <- length(arrayy)
for (i in 2:n) {
markValue <- arrayy[i]
j <- i - 1
while (j > 0) {
if (arrayy[j] > markValue) {
arrayy[j + 1] <- arrayy[j]
arrayy[j] <- markValue
}
j <- j - 1
}
}
return(arrayy)
}
代码(Java)
import java.util.Arrays;
public class InsertSort {
public static int[] insertSort(int[] sourceArray){
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
for (int i = 1;i<arr.length;i++){
int temp = arr[i];
int j = i;
while (j > 0 && arr[j-1] > temp){
arr[j] = arr[j-1];
j--;
}
if (j != i) arr[j] = temp;
}
return arr;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(insertSort(new int[]{9,8,7,6,5,4,3,2,1})));
}
}
算法思路
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
动图:
希望能帮到你