第二次更新
- 基本思想:
- 把数组分成两个部分,一部分是已排序的,另一部分是未排序的。
- 从第二个元素开始(因为开始的时候第一部分只有一个元素,已经是排好序的,也就是默认第一个元素在第一部分,其他元素在第二部分)把所有元素依次插入到第一部分中。
- 具体行为就是把第二部分中的每一个元素和第一部分中的元素依次比较,假设按升序排列,当待排序元素(第二部分)大于比较元素(第一部分)时就进行下一次比较,和第一部分的下一个元素进行比较,直到遇到小于的情况,就把该元素插入到那个元素的前面。
- 进行第二部分的下一个元素的插入,直到第二部分元素全部插入完毕。
举个例子: int [] x = {1,5,8,7,6,9,12,4,65,85,145};
已排序 待插入
第一趟排序完成: [1,5] [8,7,6,9,12,4,65,85,145]
第二趟排序完成: [1,5,8] [7,6,9,12,4,65,85,145]
第三趟排序完成: [1,5,7,8] [6,9,12,4,65,85,145]
第四趟排序完成: [1,5,6,7,8] [9,12,4,65,85,145]
第五趟排序完成: [1,5,6,7,8,9] [12,4,65,85,145]
第六趟排序完成: [1,5,6,7,8,9,12] [4,65,85,145]
第七趟排序完成: [1,4,5,6,7,8,9,12] [65,85,145]
第八趟排序完成: [1,4,5,6,7,8,9,12,65] [85,145]
第九趟排序完成: [1,4,5,6,7,8,9,12,65,85] [145]
第十趟排序完成: [1,4,5,6,7,8,9,12,65,85,145] []
- 算法分析: 平均时间复杂度:O(n2)
最好情况:O(n)
最坏情况:O(n2)
空间复杂度:O(1)
稳定性:稳定
下面是代码:
import java.util.Arrays;
public class Insertion_Sort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] x = {1,5,8,7,6,9,12,4,65,85,145};
insertionSort(x);
}
public static void insertionSort(int[] arr){
for( int i = 1; i < arr.length; i++ ) { // 从第二个元素开始插入
int temp = arr[i]; // 取出下一个元素,在已经排序的元素序列中从后向前扫描
for( int j = i; j >= 0; j-- ) {
if( j > 0 && arr[j-1] > temp ) {
// 如果该元素(已排序)大于取出的元素temp,将该元素移到下一位置
arr[j] = arr[j-1];
} else {
// 将新元素插入到该位置后
arr[j] = temp;
break;
}
}
System.out.println(Arrays.toString(arr));
}
}
}
如果各位发现其中有什么错误的话,欢迎指出来,谢谢大家观看。