任务描述
本关任务:实现插入排序算法,并将乱序数列变成升序。
相关知识——直接插入排序
直接插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
-
算法步骤:
-
从第一个元素开始,该元素认为已经被排序;
-
取下一个元素,在已经排序的元素序列中从后向前扫描;
-
如果已排序元素大于新元素,将已排序元素移到下一位置;
-
重复步骤
3
,直到找到已排序的元素小于或者等于新元素的位置; -
将新元素插入到该位置后;
-
重复步骤
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 **********/ }