数据排序、数据插入

文章讨论了两个C++代码片段中的错误,涉及数组排序和插入操作。错误主要在于对数组作为参数传递时的指针理解不准确,以及对已排序数组的插入逻辑。作者提供了正确的代码示例,使用辅助数组来避免未初始化元素的问题。
摘要由CSDN通过智能技术生成

关于四个数从大到小的错误算法思想

#include<iostream>
using namespace std;
int main() {
	int a, b, c, d, t;
	cin >> a >> b >> c>>d;
	if (a < b) {//这一步走完a>=b
		t = a;
		a = b;
		b = t;
	}
	if (c < d) {//这一步走完c>=d
		t = c;
		c = d;
		d = t;
	}
	if (b < c) {//这一步走完b>=c
		t = b;
		b = c;
		c = t;
	}
	cout << a << ' ' << b << ' ' << c << ' ' << d << ' ';
}

误以为程序走完后a>=b>=c>=d;这是不对的,因为随着abcd位置的交换,会导致相对位置的变换。

有一个已经排好序的数组,现输入一个数,要求按原来的规律将它插入数组中。

错误代码1:

#include <iostream>
using namespace std;
void insert(int [],int);

int main() {
    int a[5]={1,2,3,4};
    insert(a,5);
    for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){
        cout<<a[i]<<' ';
    }
}
void insert(int a[],int data){
    //先判断数组是升序还是降序
    int result=0;
    for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){
        if(a[i]<a[i+1]){                //数组是升序
            result=1;
            break;
        }
        if(a[i]>a[i+1]){                //数组是降序
            result=0;
            break;
        }
    }
    int temp;                           //用于元素向后挪位
    if(result==1){
        for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){ 
            if(a[i]<data);              
            else{                       //a[i]的位置就是插入data的位置,之后元素向后挪位
                temp=a[i+1];
                a[i+1]=a[i];
                a[i]=data;
            }
            
        }
        
    }
    if(result==0){
        for(int i=0;i<sizeof(a)/sizeof(a[0]);i++){ 
            if(a[i]>data);              
            else{                       //a[i]的位置就是插入data的位置,之后元素向后挪位
                temp=a[i+1];
                a[i+1]=a[i];
                a[i]=data;
            }
            
        }
        
    }
}

错误原因:

数组作为函数参数传递的时候,sizeof()将数组看作指针,结果是指针的大小,而非整个数组所占内存

错误代码2:

#include <iostream>
using namespace std;
void insert(int[], int, int);

int main() {
    int a[6] = { 1,2,3,4 };
    int count = sizeof(a);                                  //用于计算数组的字符数
    insert(a, 5, count);
    for (int i = 0; i < count / sizeof(a[0]); i++) {
        cout << a[i] << ' ';
    }
}
void insert(int a[], int data, int size) {
    //先判断数组是升序还是降序
    int result = 0;
    for (int i = 0; i < size / sizeof(a[0]); i++) {
        if (a[i] < a[i + 1]) {                //数组是升序
            result = 1;
            break;
        }
        if (a[i] > a[i + 1]) {                //数组是降序
            result = 0;
            break;
        }
    }
    int temp;                           //用于元素向后挪位
    if (result == 1) {
        for (int i = 0; i < size / sizeof(a[0]); i++) {
            if (a[i] < data) {
                continue;
            }
            else {//走到这里时,a[i]>=data,a[i]的位置就是插入data的位置
                for (int j = i; j < size / sizeof(a[0]); j++) { //元素向后挪位
                    temp = a[j + 1];
                    a[j + 1] = a[j];
                }
            }
            
            a[i] = data;

        }

    }
    if (result == 0) {                      //数组是降序
        for (int i = 0; i < size / sizeof(a[0]); i++) {
            if (a[i] > data) {
                continue;
            }
            else {            //走到这里时,a[i]<=data,a[i]的位置就是插入data的位置
                for (int j = i; j < size / sizeof(a[0]); j++) { //元素向后挪位
                    temp = a[j + 1];
                    a[j + 1] = a[j];
                }
            }

            a[i] = data;

        }

    }
}

错误原因:

数组a初始化之后,其内的元素分别为:a={1,2,3,4,0,0};该数组原来并不是有序的

正确代码:

#include<stdio.h>

void insert(int a[], int b[], int data, int size);
int main()
{
	int a[11] = { 2,3,4,5,6,7,8,13,18,20 };//初始化十个元素
	int b[11],data;
	printf("请输入待插入的值:");
	scanf_s("%d", &data);
	insert(a, b, data, 10);
	return 0;
}
void insert(int a[],int b[], int data, int size) {
	int i = 0;
	//待插入元素比最后一个元素大
	if (a[size-1] <= data) {
		for (int j = 0; j < size; j++) {			//复制a数组元素到b数组中来
			b[j] = a[j];
		}
		b[size] = data;									//插入元素
	}
	else {
		for (int j = 0; j < size; j++) {				//找到待插入位置
			if (a[i] < data) {
				continue;
			}
		}
		for (int j = size; j > i; j--) {				//元素向后移位
			a[j] = a[j - 1];
		}											
		a[i] = data;
		for (int j = 0; j <= size; j++) {			//复制a数组元素到b数组中来
			b[j] = a[j];
		}
	}
	for (int j = 0; j <= size; j++) {			//复制a数组元素到b数组中来
		printf("%d ", b[j]);
	}


}

采用一个辅助数组b,来避免a数组中未初始化的元素自动初始化为0

异常情况:解决办法:

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值