首页 > 试题广场 >

设有一组初始关键字序列为(30,20,10,25,15,28

[单选题]
设有一组初始关键字序列为(30,20,10,25,15,28),则第4趟直接插入排序结束后的结果的是()
  • 10,15,20,25,30,28
  • 10,15,20,25,28,30
  • 10,20,25,30,15,28
  • 10,20,30,25,15,28
推荐
A。考察的是直接插入排序的原理。

直接插入排序的思想

每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。

根据题干初始关键字序列为(30,20,10,25,15,28) 步骤如下:括号内为有序括号外为待排序数列
  1. (20 30)10 25 15 28      30看作有序数列,其下一个元素20做比较,排在30之前
  2. (10 20 30)25 15 28      以此类推逐渐比较下一个元素,做插入处理
  3. (10 20 25 30)15 28
  4. (10 15 20 25 30)28
  5. (10 15 20 25 28 30)
根据步骤逐步插入比较,第四趟为 A选项 (10 15 20 25 30)28

编辑于 2019-08-21 14:12:02 回复(0)
写了个插排按顺序打印出了每一步的结果:
[30, 20, 10, 25, 15, 28]  30 默认为有序数列
[20, 30, 10, 25, 15, 28]  【第一次结束】
[10, 20, 30, 25, 15, 28]
[10, 20, 25, 30, 15, 28] 
[10, 15, 20, 25, 30, 28]【第四次插入结束】 选A
[10, 15, 20, 25, 28, 30]
最终结果:[10, 15, 20, 25, 28, 30]

以下为插排的动态演示:


以下为java插排代码
import java.util.Arrays;
class InsertionSort{
    
     public static int[] insertionSort02(int[] arr){
        for(int i = 0; i < arr.length; i++){
            int temp = arr[i];
            for(int j = i; j >=0; j--){
                if(j > 0 && arr[j-1] > temp){
                    arr[j] = arr[j-1];
                } else {
                    arr[j] = temp;
                    break;
                }
            }
            System.out.println(Arrays.toString(arr));
        }
        return arr;
    }
       public static void main(String[] args) {
        System.out.println(Arrays.toString(insertionSort02(new int[]{30,20,10,25,15,28})));
    }
}


编辑于 2019-08-26 13:42:01 回复(0)
我傻了   第四次插入排序 应该已经排好5位数 所以 应该是A
发表于 2020-05-27 16:39:12 回复(1)
选A
每一趟处理一个待排序的关键字
第k趟结果将会处理前(K+1)个关键字的结果
第四趟,即是前五个关键字已经排好序,故选A
发表于 2019-08-21 10:25:00 回复(1)
答案A。插入排序默认第一个元素为有序数列,第一轮的是第二个元素与有序数列比较,得到包含两个元素的有序序列,所以n轮比较,有序序列为n+1个
发表于 2019-08-20 22:10:49 回复(0)
第一个数字,不算一趟插入排序。
发表于 2022-01-14 12:03:01 回复(0)
第n趟之后,有序序列元素为前n+1个,A
发表于 2019-08-20 14:59:53 回复(0)