在有序的数组中插入元素,在不改变数组原来排序的情况下进行.
本方法可以适用于将无序数组改成有序数组,再将要插入数组的元素放进去.
本题有多种方法解答, 本文介绍两种,一个值传递,一个地址传递.
值传递方法思想在于运用遍历数组,寻找符合条件的位置,将被影响到的元素进行操作,就是移位,在于创建中间变量进行存储和赋值操作.
地址传递方法思想在于运用指针的指向,指向尤为关键,区分*(arr+1)和*arr+1的两者的差别.其次在于循环体对于指针地址的影响,每次循环体结束后,观察指针最后的指向,是否是被循环体的条件所改变(就是地址的位置是否多加了1个等等).
第一种方法: 值传递
#include"iostream"
using namespace std;
#include"algorithm"
#include"iomanip"
void print(int arr[],int len){
for(int i = 0;i < len;i++){
cout << left << setw(3) << arr[i]; // 对齐的头文件是iomanip
}putchar('\n');
}
int main(void){
int arr[10] = {3,6,7,1,0,9,4,2,3,7,};
int len = sizeof(arr) / sizeof(int);
sort(arr,arr+len,less<int>()); // 从小到大 头文件 algorithm
//sort(arr,arr+len,greater<int>()); // 这是从大到小的排序
print(arr,len);
int index = 5; // 要插入的数字
if(arr[len - 1] < index){ // 先判断是否大于最后一项
arr[len] = index; len++;
} else {
for(int i = 0;i < len;i++){
if(arr[i] >= index){ // 区间里比较 若找到大于index 则这个i以后的每一项往后移一个位置
int j = len - 1; // 从len-1的位置开始移 避免值覆盖的情况出现
for(;j >= i;j--){
arr[j + 1] = arr[j];
}arr[i] = index; len++; break; // 全部赋值完 len++
}
}
}
print(arr,len);
return 0;
}
第二种方法: 指针传递
#include"iostream"
using namespace std;
#include"algorithm"
#include"iomanip"
#include"stdlib.h"
#include"ctime"
void print(int * arr,int len){
for(int i = 0;i < len;i++,arr++){
printf("%-5d",*arr);
}putchar('\n');
}
void sortArr(int * arr,int len,int index){
int temp1,temp2;
if(*arr < index){ // 若最大项小于index
temp1 = *arr;
*arr = index;
len++; arr++;
for(int i = 1;i < len;arr++,i++){
temp2 = *arr;
*arr = temp1;
temp1 = temp2;
}arr--; /*for循环最后多加了一次 再减回去一次*/
}else if(*(arr + len - 1) > index){
*(arr + len) = index;
}else{
for(int i = 0;i < len;arr++,i++){
if(*arr <= index){ // 找到了
int j = i;
while(j < len){ // 把指针移到最后
j++;
arr++;
}arr--; // 需要再减一次回去 因为while循环多加了一次
for(j = len - 1;j >= i;j--,arr--){
*(arr + 1) = *(arr);
} arr++;/*同理 再加一次回去*/ *arr = index; break;
}
}
}
}
int main(void){
int len = 10;
// 随机生成
// int arr[1000] = {0};
// srand(time(0));
// for(int i = 0;i < len;i++){
// int number = rand()%(99 - 80)+80; // [80,99)
// arr[i] = number;
// }
int arr[len]{89,90,45,23,78,10,23,22,77,10};
sort(arr,arr+len,greater<int>()); // 从大到小排列
print(arr,len);
int index = 50;
sortArr(arr,len,index); // 指针传递数组 只需传递数组即可 数组名即是数组地址
len++; // 因为已经插入了一个元素进去 所以len++
print(arr,len);
return 0;
}