作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
所以我刚刚开始学习 C 语言和算法,并且在我的选择排序算法中遇到了一个问题。它给我这个作为输出:
>10
>12
>13
>16
>23
>25
>42
>60
>50
>52
最后三位数字乱序。从我的眼睛看,他们不应该。你能告诉我这里可能是什么问题吗?此外,我的目标是在没有任何指示的情况下执行此操作,上一节课仍然有点模糊,我知道没有它也可以完成。我相信这更像是一个逻辑错误而不是内存错误。谢谢大家!
#include <stdio.h>
int main(void) {
int max = 10;
int a[max];
//Makes unsorted array
a[0] = 10;
a[1] = 23;
a[2] = 50;
a[3] = 12;
a[4] = 52;
a[5] = 60;
a[6] = 25;
a[7] = 13;
a[8] = 42;
a[9] = 16;
/*
SWAP MODEL
printf("a[2] = %d \n", a[2]);
int temp = a[3];
a[3] = a[2];
a[2] = temp;
printf("a[2] = %d \n", a[2]);
*/
//Sorts array
int n;
int s = 0;
int p = 0;
for (n = 0; n < max-1; n++){
int smallest = a[n];
for(s = n + 1; s < max; s++){
if(smallest > a[s]) {
smallest = a[s];
p = s;
}
}
if (n == 0 && p == 0) {
int temp = a[n];
a[n] = a[p];
a[p] = temp;
}
else if (n > 0 && p == 0) {
p = n;
int temp = a[n];
a[n] = a[p];
a[p] = temp;
}
else {
int temp = a[n];
a[n] = a[p];
a[p] = temp;
}
}
//Checks if sorted
for(int number = 0; number < 10; number++) {
printf("%d \n", a[number]);
}
}
最佳答案
int smallest = a[n];
这里你忘记了初始化 p = n
,所以你的不变量 smallest == a[p]
被违反了。加上这个就可以了。
一些评论:
if (n == 0 && p == 0) {
int temp = a[n];
a[n] = a[p];
a[p] = temp;
}
else if (n > 0 && p == 0) {
p = n;
int temp = a[n];
a[n] = a[p];
a[p] = temp;
}
else {
int temp = a[n];
a[n] = a[p];
a[p] = temp;
}
整个结构是多余的,它在每种情况下都做同样的事情。您可以通过无条件交换来替换它。我对清理版本的尝试:
for (int n = 0; n < max-1; n++){
int p = n;
int smallest = a[p];
for (int s = n + 1; s < max; s++){
if (smallest > a[s]) {
smallest = a[s];
p = s;
}
}
int temp = a[n];
a[n] = a[p];
a[p] = temp;
}
关于C选择排序谬误,不会对最后3个数字进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22181924/
我是一名优秀的程序员,十分优秀!