直接插入排序是将一个记录插入到已排好序的有序表中,从而得到一个新的,记录增1的有序表。
public class StraightInsertionSort {
public static void main(String[] args) {
int nums[] = {98, 35, 4, 34, 29, 35};
InsertSort(nums);
}
public static void InsertSort(int[] a) {
if(a.length!=0) {//一定要先判断,判断数组是否为空
int j, k;
for (int i = 1; i < a.length; i++) {//控制趟数
for (j = i - 1; j >= 0; j--) {//比较大小
if (a[i] >= a[j]) {//一定是>=,这样才能在两个数字一样大的情况下,不用交换位置,保证了排序的稳定性
break;
}
}
int temp = a[i];
for (k = i - 1; k > j; k--)//移动次数
a[k + 1] = a[k];
a[k + 1] = temp;
for (int n = 0; n < a.length; n++) {//输出每一趟的结果,每趟结果输出一行
System.out.print(a[n] + " ");
}
System.out.println();
}
}
}
}
整个排序过程为进行n-1趟插入,即:先将序列中的第1个记录看成是一个有序的子序列,然后从第2个记录起逐个插入,直至整个序列变成按关键字非递减有序序列为止。从空间上来看,它只需要一个记录的辅助空间,监视哨a[0],因此空间复杂度为O(1)。从时间来看,排序的基本操作为:比较两个关键字的大小和移动记录。在整个排序过程中,当待排序列中记录按关键字非递减有序排列时,所需进行关键字的比较次数达到最小为n-1,,记录不需有移动;反之,当待排序列中记录按关键字非递增有序排列时,总的比较次数最大(n+2)(n-1)/2,记录移动次数也达到最大值(n+4)(n-1)/2。若待排序列是随机的,则取最大最小值的平均值,所以时间复杂度为O(n*n)。