在有序的数组中插入元素,不改变数组的顺序

在有序的数组中插入元素,在不改变数组原来排序的情况下进行.

本方法可以适用于将无序数组改成有序数组,再将要插入数组的元素放进去.

本题有多种方法解答, 本文介绍两种,一个值传递,一个地址传递.

值传递方法思想在于运用遍历数组,寻找符合条件的位置,将被影响到的元素进行操作,就是移位,在于创建中间变量进行存储和赋值操作.

地址传递方法思想在于运用指针的指向,指向尤为关键,区分*(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;
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值