作用域和链接属性
#include <stdio.h>#include <stdlib.h>
#include <time.h>
int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);
int in_order(int array[], int length)
{
int i = 0;
while (array <= array && ++i < length - 1)
;
if (i == length - 1)
{
return 1;
}
else
{
return 0;
}
}
void shuffle(int array[], int length)
{
int index, temp, i;
static int t1, t2;
srand(t1);
t1 = rand();
t2 = time(NULL);
srand(t1+t2);
for (i = 0; i < length; i++)
{
index = rand() % (length - i) + i;
if (index != i)
{
temp = array;
array = array;
array = temp;
}
}
}
void bogo_sort(int array[], int length)
{
while (!in_order(array, length))
{
shuffle(array, length);
}
}
int main(void)
{
int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
int i, length;
time_t begin, end;
begin = time(NULL);
length = sizeof(array) / sizeof(array);
bogo_sort(array, length);
printf("排序后的结果是:");
for (i = 0; i < length; i++)
{
printf("%d ", array);
}
putchar('\n');
end = time(NULL);
printf("总共耗时:%ld秒\n", end - begin);
return 0;
}
无法正常运行,打开没有东西,会陷入死循环!
程序目的是实现无限猴子定理,用随机的方法打乱数组,总有一次数组会按照从小到大的顺序排列。
、
严重怀疑问题出在红色语句 {:10_247:} 你这是要排序吗???为何选猴子?慢死了~~算法好像有问题 哎呦,这个小甲鱼的课后作业,他是让实现这个算法呢,而且这个还是小甲鱼的正确答案,算法就是有问题,就在红字哪里,我自己试验了试验,后来发现好像第一个函数就不会进入 if 语句 ,只会进入 else 本帖最后由 claws0n 于 2018-10-16 19:20 编辑
啊涂涂 发表于 2018-10-16 19:17
哎呦,这个小甲鱼的课后作业,他是让实现这个算法呢,而且这个还是小甲鱼的正确答案,算法就是有问题,就在 ...
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);
int in_order(int array[], int length)
{
int i = 0;
while (array <= array && ++i < length - 1)
;
if (i == length - 1)
{
return 1;
}
else
{
return 0;
}
}
void shuffle(int array[], int length)
{
int index, temp, i;
static int t1, t2;
srand(t1);
t1 = rand();
t2 = time(NULL);
srand(t1+t2);
for (i = 0; i < length; i++)
{
index = rand() % (length - i) + i;
if (index != i)
{
temp = array;
array = array;
array = temp;
}
}
}
void bogo_sort(int array[], int length)
{
while (!in_order(array, length))
{
shuffle(array, length);
}
}
int main(void)
{
int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
int i, length;
time_t begin, end;
begin = time(NULL);
length = sizeof(array) / sizeof(array);
bogo_sort(array, length);
printf("排序后的结果是:");
for (i = 0; i < length; i++)
{
printf("%d ", array);
}
putchar('\n');
end = time(NULL);
printf("总共耗时:%0.4lf秒\n", (double)(end - begin)/CLOCKS_PER_SEC);
return 0;
} claws0n 发表于 2018-10-16 19:19
怎么又复制了一遍? 啊涂涂 发表于 2018-10-16 19:23
怎么又复制了一遍?
?可以执行{:10_256:} claws0n 发表于 2018-10-16 19:25
?可以执行
啊,我的电脑为啥不行呢?而且你看这个程序,如果从第一个函数进去的话是:
第一个i 第二个i 第三个i length == 10
0 1 2 < length - 1
2 3 4
4 5 6
你看像这个第一次拿0和1比,第二次就直接是2和3比了,那假如说2比一大那不就出问题了? 啊涂涂 发表于 2018-10-16 19:49
啊,我的电脑为啥不行呢?而且你看这个程序,如果从第一个函数进去的话是:
第一个i ...
这个算法是不保证收敛的,每一次进行打乱,然后结束,如果不是排序好的,重复……
跟你那个 i 不 i 的没有关系。他没有比较关系,哪一行? 26~47 只有赋值 claws0n 发表于 2018-10-16 19:57
这个算法是不保证收敛的,每一次进行打乱,然后结束,如果不是排序好的,重复……
跟你那个 i 不 i 的没 ...
嗯嗯,那第一个函数就是检测是否是按照顺序排列的嘛,那就像我刚才说的那样,那岂不是检测的不准确?而且最后退出 i 的时候结果 i 会比 length大,我拿纸推算了好几遍,就是一直不理解 你看我推算的那个,拿数组的第0个数和第一个比,然后第一个不和第二个比,直接跳到第二个和第三个比去了
那个array【i】-> array -> ++i 看这个 i 变了好多次呢 啊涂涂 发表于 2018-10-16 20:06
你看我推算的那个,拿数组的第0个数和第一个比,然后第一个不和第二个比,直接跳到第二个和第三个比去了
...
那个对呀,遍历数组的所有元素
第一跟第二比,第二跟第三比…… claws0n 发表于 2018-10-16 20:08
那个对呀,遍历数组的所有元素
第一跟第二比,第二跟第三比……
哦哦,哈哈,我迷糊了。那这个程序都没问题,在我的电脑上为啥不能运行呢?和系统有关? 啊涂涂 发表于 2018-10-16 20:15
哦哦,哈哈,我迷糊了。那这个程序都没问题,在我的电脑上为啥不能运行呢?和系统有关?
你什么编译器? claws0n 发表于 2018-10-16 20:22
你什么编译器?
Dev C++ 啊涂涂 发表于 2018-10-16 20:23
Dev C++
就小甲鱼视频上让推荐下载的那个,我是win10系统 啊涂涂 发表于 2018-10-16 20:23
Dev C++
有执行#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);
int in_order(int array[], int length)
{
int i = 0;
while (array <= array && ++i < length - 1)
;
if (i == length - 1)
{
return 1;
}
else
{
return 0;
}
}
void shuffle(int array[], int length)
{
int index, temp, i;
static int t1, t2;
srand(t1);
t1 = rand();
t2 = time(NULL);
srand(t1+t2);
for (i = 0; i < length; i++)
{
index = rand() % (length - i) + i;
if (index != i)
{
temp = array;
array = array;
array = temp;
}
}
}
void bogo_sort(int array[], int length)
{
int c = 0;
while (!in_order(array, length))
{
shuffle(array, length);
printf("%d\n",c++);
}
}
int main(void)
{
int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
int i, length;
time_t begin, end;
begin = time(NULL);
length = sizeof(array) / sizeof(array);
bogo_sort(array, length);
printf("排序后的结果是:");
for (i = 0; i < length; i++)
{
printf("%d ", array);
}
putchar('\n');
end = time(NULL);
printf("总共耗时:%0.4lf秒\n", (double)(end - begin)/CLOCKS_PER_SEC);
return 0;
} claws0n 发表于 2018-10-16 20:25
有执行
行吧 claws0n 发表于 2018-10-16 20:25
有执行
麻烦我再问下,正确答案里,第一个函数 && 后面的 ++i < length - 1
这里++i的值之后,i 会变化吗?假如说 i 是1,++完之后会不会变成2呢? 啊涂涂 发表于 2018-10-16 20:39
麻烦我再问下,正确答案里,第一个函数 && 后面的 ++i < length - 1
这里++i的值之后,i 会变化吗? ...
当然会改变 claws0n 发表于 2018-10-16 20:43
当然会改变
#include <stdio.h>
int main(void)
{
int array[] = {1, 2, 3, 4, 5};
int length = 3;
int i = 0;
while (array <= array && ++i < length - 1)
{
printf("%d", i);
}
return 0;
}
这是我又专门把刚才那个给划了出来,结果打印的是1, 不应该是2嘛
页:
[1]
2