11.20晚自习 数组中插入一个新的数据

发布于 18 小时前  12 次阅读


#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void pai(int* in) {
	for (int i = 0; i < 9; i++) {
		int max = in[i],t;
		for (int j = i + 1; j < 9; j++) {
			if (max < in[j]) {
				max = in[j];
				t = j;
			}
		}
		if (max != in[i]) {
			int temp = in[i];
			in[i] = max;
			in[t] = temp;
		}
	}
}


int main() {
	int in[10];
	for (int i = 0; i < 9; i++) {
		scanf("%d", &in[i]);
	}
	pai(in);
	int n;
	scanf("%d", &n);
	int temp;
	for (int i = 0; i < 9; i++) {
		if (n >= in[i] && n <= in[i + 1]) {
			temp = i;
		}
	}
	for (int i = 8; i > temp; i--) {
		in[i]++;
	}
	in[temp + 1] = n;
	for (int i = 0; i < 10; i++) {
		printf("%d", in[i]);
	}
	return 0;
}

首先说明,这个选择排序我没有错,好吧,甚至这个外循环还会多遍历一次(最后的值已经是排好了的,你还比柠檬呢)

for (int i = 8; i > temp; i--) {
		in[i]++;
	}
	in[temp + 1] = n;

这个代码块是错误的

in[i]++;它会将数组中的元素值增加 1,而不是简单地移动元素

为了正确地将元素向后移动并插入新元素 n,我们要做的应该是将数组中的元素从前往后移动
for (int i = 8; i > temp; i--) {
in[i + 1] = in[i]; // 将元素向后移动
}
in[temp + 1] = n; // 在 temp + 1 的位置插入新元素 n

这里的 i从倒二个位置(有实际数据的最后一个)开始, in[i + 1] = in[i]便将最后的位置利用了起来

同时,这里应该到temp+1为止,因为你也需要把temp+1这个位置给拷贝到后面去

而这个temp+1的位置应该赋值为新的这个数据 n


你花了10分钟左右一直疑惑为什么改进完的代码仍然不能正常运行

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

void pai(int* in) {
	for (int i = 0; i < 9; i++) {
		int max = in[i], t=0;
		for (int j = i + 1; j < 9; j++) {
			if (max < in[j]) {
				max = in[j];
				t = j;
			}
		}
		if (max != in[i]) {
			int temp = in[i];
			in[i] = max;
			in[t] = temp;
		}
	}
}


int main() {
	int in[10] = {0};
	for (int i = 0; i < 9; i++) {
		scanf("%d", &in[i]);
	}
	pai(in);
	int n;
	scanf("%d", &n);
	int temp=-1;
	for (int i = 0; i < 8; i++) {
		if (n <= in[i] && n >= in[i + 1]) {
			temp = i;
		}
	}
	
	if (temp != -1) {
		for (int i = 8; i > temp; i--) {
			in[i + 1] = in[i];
		}
		in[temp + 1] = n;
	}
	for (int i = 0; i < 10; i++) {
		printf("%d ", in[i]);
	}
	return 0;
}

而上面的代码块可以正常运行

这是因为你最初的if (n <= in[i] && n >= in[i + 1]) 考虑反了,因为pai运行完之后是倒序,而不是正序


插入逻辑: 在插入新元素 n 的逻辑中,你只考虑了 in[i]in[i + 1] 的比较,但没有考虑到 n 可能小于最小值或大于最大值的情况

  for (int i = 0; i < 8; i++) { // 这里是8,以后记住出现了n+1就要考虑是不是会数组溢出
        if (n >= in[i] && n <= in[i + 1]) {
            temp = i;
            break; // 找到后可以直接退出
        }
    }

    if (temp != -1) {
        for (int i = 8; i > temp; i--) {
            in[i + 1] = in[i];
        }
        in[temp + 1] = n;
    } else if (n < in[0]) { // 如果 n 小于最小值
       
         in[10] = n;//因为是倒序,最后一个赋值为n即可
    
    } else if (n > in[8]) { // 如果 n 大于最大值
       
         for(int i=8;i>=0;i++){
          in[i+1]=in[i];
          }
          in[0]=n;//同理,全部往右边移,然后第一个赋值为n即可

    }

这样就perfect了!

届ける言葉を今は育ててる
最后更新于 2024-11-21