#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了!
Comments NOTHING