简单的选择排序程序。在85%的情况下都能完美地工作,但有时不能';t排序 #包括 #包括 #包括 main() { 内部中心、内部、外部、didSwap、温度; int nums[10]; 时间; srand(time&t)); 对于(ctr=0;ctr
它在大多数情况下都能工作,但有时不能正确排序,有时根本不能排序 注意:如果代码不正确,那么为什么它在85%的情况下都能正常工作 错误快照简单的选择排序程序。在85%的情况下都能完美地工作,但有时不能';t排序 #包括 #包括 #包括 main() { 内部中心、内部、外部、didSwap、温度; int nums[10]; 时间; srand(time&t)); 对于(ctr=0;ctr,c,sorting,selection-sort,C,Sorting,Selection Sort,它在大多数情况下都能工作,但有时不能正确排序,有时根本不能排序 注意:如果代码不正确,那么为什么它在85%的情况下都能正常工作 错误快照 由于某种原因,如果未对任何特定元素进行交换,则您将中断,从而使其他元素未排序: #include <stdio.h> #include <stdlib.h> #include <time.h> main() { int ctr, inner, outer, didSwap, temp; int nums[1
由于某种原因,如果未对任何特定元素进行交换,则您将中断
,从而使其他元素未排序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int ctr, inner, outer, didSwap, temp;
int nums[10];
time_t t;
srand(time(&t));
for (ctr = 0; ctr < 10; ctr++) {
nums[ctr] = (rand() % 99) + 1;
}
printf("\nHere is the list before the sort:\n");
for (ctr = 0; ctr < 10; ctr++) {
printf("%3d", nums[ctr]);
}
// Sorting the array
for (outer = 0; outer < 9; outer++) {
didSwap = 0;
for (inner = outer + 1; inner < 10; inner++) {
if (nums[inner] < nums[outer]) {
temp = nums[inner];
nums[inner] = nums[outer];
nums[outer] = temp;
didSwap = 1;
}
}
if (didSwap == 0) {
break;
}
}
printf("\n\nHere is the list after sorting:\n");
for (ctr = 0; ctr < 10; ctr++) {
printf("%3d", nums[ctr]);
}
printf("\n");
return 0;
}
您需要删除上述条件才能使其工作并对所有元素进行排序。在标准选择排序算法中也不需要这样的条件。当没有交换时,您正在中断外部循环。这将不起作用,因此请删除didSwap
并删除以下代码
if (didSwap == 0) {
break;
}
程序应该可以正常工作。您的代码是冒泡排序的错误实现
如果数组的第一个元素是较小的元素(如问题中的示例),则代码
if (didSwap == 0) {
break;
}
在第一个转弯处断开循环,则无任何排序
冒泡排序中存在一个类似于didSwap的测试,但实现不同,它不会执行if(nums[inner]
而会将每个元素与下一个元素进行比较
如果代码不正确,那么为什么它在85%的情况下工作
我不知道这85%是从哪里来的(很可能是错误的),当然这一切都取决于数组中的值,但是当nums[outer]
小于所有具有较大索引的元素时,程序停止,并且具有较大索引的元素不会被排序。在您问题中的示例中,第一个元素是数组中较小的元素,因此没有排序
因此有两种可能性:
- 要删除所有相关的数据交换,请执行以下操作:
- 实现冒泡排序
if (didSwap == 0) {
break;
}
找到不起作用的特定情况,尝试最小化输入集,然后使用调试器在监视变量及其值的同时逐个语句地检查代码语句。这是相同的。这个问题有什么不同?@高炉啊,是的,你是对的。希望我对你的问题的回答有时不合适,但无论如何,像你那样重复一个问题是不对的。请选择您喜欢的答案,并删除另一个问题,如果您不尽快回答,我们将按照您喜欢的方式处理,包括删除您的两个问题……这是否回答了您的问题?首先,didSwap标志变量在for循环之外,因此,只有在测试整个步骤而不是第一个元素时,该条件才是真的。其次,对于你的“很可能是错误的”评论,只要试着运行我的代码一次,你就会知道@jiVatx19当然,var是在嵌套循环外定义并设置为0的,显然您不了解发生了什么。我还鼓励你不要对帮助你的人咄咄逼人。这是一种选择排序算法,而不是冒泡排序算法。这是一个不同的问题。我无意挑衅,如果我听起来是这样的话,那么很抱歉。请只运行我的代码一次。@jiVatx19所以,删除你的两个问题中的一个,这两个问题都是克隆的,然后“接受”你对仍然存在的问题的答案,单击其左侧的灰色标记(类似于V),表示你的问题已结束(),didSwap flag变量在for循环之外,因此只有在测试整个步骤而不是第一个元素时,该条件才是真的。只要试着运行我的代码,然后告诉我为什么它85%的时间都能工作?伙计,didSwap标志变量在for循环之外,因此只有在整个步骤都没有排序而不仅仅是第一个元素的情况下测试时,情况才会变为真。试着运行我的代码,然后告诉我为什么它工作85%次?如果你的第一个元素是最小的,那么它将与一个内部迭代中的所有其他N-1元素进行比较,并且没有交换,所以当它从内部循环中出来时,它甚至不考虑其他元素被排序或不,它只是中断了外环。谢谢。我得到了它。
for (inner = outer + 1; inner < 8; inner++) {
if (nums[inner] > nums[inner + 1]) {
temp = nums[inner];
nums[inner] = nums[inner + 1];
nums[inner + 1] = temp;
didSwap = 1;
}
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int ctr, inner, outer, didSwap, temp;
#if 1
int nums[10] = { 4, 6, 25, 9, 60, 59, 44, 65, 59, 90};
#else
int nums[10];
time_t t;
srand(time(&t));
for (ctr = 0; ctr < 10; ctr++) {
nums[ctr] = (rand() % 99) + 1;
}
#endif
puts("\nHere is the list before the sort:");
for (ctr = 0; ctr < 10; ctr++) {
printf("%3d", nums[ctr]);
}
// Sorting the array
for (outer = 0; outer < 9; outer++) {
didSwap = 0;
for (inner = outer + 1; inner < 8; inner++) {
if (nums[inner] > nums[inner + 1]) {
temp = nums[inner];
nums[inner] = nums[inner + 1];
nums[inner + 1] = temp;
didSwap = 1;
}
}
if (didSwap == 0) {
break;
}
}
puts("\n\nHere is the list after sorting:");
for (ctr = 0; ctr < 10; ctr++) {
printf("%3d", nums[ctr]);
}
putchar('\n');
return 0;
}
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
Here is the list before the sort:
4 6 25 9 60 59 44 65 59 90
Here is the list after sorting:
4 6 9 25 44 59 59 60 65 90
pi@raspberrypi:/tmp $