谭浩强C++课后习题17——有序数组插入数据
题目描述:有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。
算法思路:这里先写了一个排序函数对数组进行从小到大的排序,该函数使用冒泡排序。
冒泡排序:将两个相邻的数进行比较,把较小的调到前面去。如果有5个数,第一次比较第1个数和第2个数,把较小的放前面,再将第2个数和第3个数比较,以此类推,第一轮即可“沉底”最大的一个数,再开始第二轮,按照之前的方法继续进行到第4个数为止。一共“沉底”4次,确定了4个数的位置,则最后一个数的位置也确定了,因此n个数应进行n-1轮。
插入数据:
(1)如果插入的数比数组最后一个数还大,则直接将插入数放在数组尾;
(2)如果插入的数比最后一个数小:先循环数组,找到第一个比插入数大的数,则该位置就是插入位置,用break跳出循环。找到插入位置后,要把插入位置及其之后的数都向后移动一个单位,如果从前开始移动,则前面的数会覆盖掉后面的数,因此应该从最后一个数开始,从后往前循环移动,最后令插入位置的数等于插入数。
#include<iostream>
using namespace std;
void sort(int num[], int n) {
int temp;
for (int i = 0;i < n - 1;i++) {
for (int j = 0;j < n - i - 1;j++) {
if (num[j] > num[j + 1]) {
temp = num[j];
num[j] = num[j + 1];
num[j + 1] = temp;
}
}
}
}
int main() {
int n;
cout << "输入元素个数:";
cin >> n;
int* num = new int[n + 1];
cout << "输入元素:";
for (int i = 0;i < n;i++)
cin >> num[i];
sort(num, n);
int insertNum;
cout << "输入插入数据:";
cin >> insertNum;
if (insertNum > num[n - 1])
num[n] = insertNum;
else {
int inserti = 0;
for(int j=0;j<n;j++)
if (num[j] > insertNum) {
inserti = j;
break;
}
for (int j = n - 1;j >= inserti;j--)
num[j + 1] = num[j];
num[inserti] = insertNum;
}
cout << "新数组:";
for (int i = 0;i < n + 1;i++)
cout << num[i] << " ";
return 0;
}
运行测试结果: