任务描述

本关任务:实现插入排序算法,并将乱序数列变成升序。

相关知识——直接插入排序

直接插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

  • 算法步骤:

    1. 从第一个元素开始,该元素认为已经被排序;

    2. 取下一个元素,在已经排序的元素序列中从后向前扫描;

    3. 如果已排序元素大于新元素,将已排序元素移到下一位置;

    4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

    5. 将新元素插入到该位置后;

    6. 重复步骤2~5

直接插入排序_升序

编程要求

本关的编程任务是补全sort.h文件中的simpleSelectSort函数,实现按升序方式将arr数组前面n个元素按升序进行简单选择排序,且每趟选择排序均从左至右选择首次出现的最小值,输出排序过程中的前三趟和最后一趟的排序结果。具体要求如下: // 直接插入排序算法:将arr数组前面n个元素按升序进行直接插入排序, // 调用print_array(int arr[] int n)输出前三次直接插入排序后的序列,以及最终的升序序列 void insertSort(int arr[], int n); ####评测说明 本关中包含三个文件分别是: step3/sort.h :此文件为学员文件,其中insertSort函数,待补充完整 step3/main.cpp:此文件为评测文件(含main函数),引用“sort.h”。 (上述三个文件可通过点击在代码取的右上角文件夹中的step3文件夹中查看)

输入输出说明

输入n(1<=n<=100),输入n个整数,对着n个整数采用直接插入排序方法进行升序排序,输出前三趟以及最终的排序序列,例如以下所示:

测试输入: 10 7 1 4 6 8 9 5 2 3 10 预期输出: 1 7 4 6 8 9 5 2 3 10 1 4 7 6 8 9 5 2 3 10 1 4 6 7 8 9 5 2 3 10 1 2 3 4 5 6 7 8 9 10

测试输入: 15 3 44 38 5 47 15 36 26 27 2 46 4 19 50 48 预期输出: 3 44 38 5 47 15 36 26 27 2 46 4 19 50 48 3 38 44 5 47 15 36 26 27 2 46 4 19 50 48 3 5 38 44 47 15 36 26 27 2 46 4 19 50 48 2 3 4 5 15 19 26 27 36 38 44 46 47 48 50

 

sort_.h

//
//  sort_.h
//  Sort
//
//  Created by ljpc on 2018/4/20.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#ifndef sort__h
#define sort__h

#include <cstdio>
#include <algorithm>

using namespace std;

void print_array(int *arr, int n);
// 打印数组

void sort_array(int *arr, int n);
// 数组排序

#endif /* sort__h */

 

 

main.cpp

//
//  main.cpp
//  Sort
//
//  Created by ljpc on 2018/4/20.
//  Copyright 漏 2018骞  ljpc. All rights reserved.
//

#include <iostream>
#include "sort_.h"

int main(int argc, const char * argv[]) {
    // insert code here...
    // std::cout << "Hello, World!\n";

    int n;
    scanf("%d", &n);
    
    int *arr;
    arr = (int*)malloc(sizeof(int)*n);
    
    for (int i=0; i<n; i++)
    {
        scanf("%d", &arr[i]);
    }
    
    sort_array(arr, n);
    
    return 0;
}

 

 

sort_.cpp

#include "sort_.h"

void print_array(int *arr, int n)
// 打印数组
{
    if(n==0){
        printf("ERROR: Array length is ZERO\n");
        return;
    }
    printf("%d", arr[0]);
    for (int i=1; i<n; i++) {
        printf(" %d", arr[i]);
    }
    printf("\n");
}
int n,len,i,j;
void sort_array(int *arr, int n)
//  编程实现《插入排序算法》:将乱序序列arr转化为升序序列
//  函数参数:乱序整数数组(无重复元素) 数组长度
//  要求输出:调用print_array(int *arr, int n)输出前三次插入操作后的序列,以及最终的升序序列
{
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    len =n;
    int preIndex, current;
    for (i = 1; i < len; i++) {
        preIndex = i - 1;
        current = arr[i];
        while (preIndex >= 0 && arr[preIndex] > current) {
            arr[preIndex + 1] = arr[preIndex];
            preIndex--;
        }
        arr[preIndex + 1] = current;
        if (i < 4)print_array(arr, n);
    }
    print_array(arr, n);
    
    /********** End **********/
}