鱼C论坛

 找回密码
 立即注册
查看: 2824|回复: 12

[已解决]我想实现对数组由大到小排序,请问我的代码哪里出现了问题?

[复制链接]
发表于 2022-1-22 17:02:39 | 显示全部楼层 |阅读模式
50鱼币
一道C学习的题,实现排序。

#include <stdio.h>
#include <time.h>

void bogo_sort(int, int);

void bogo_sort(int array[], int length)
{
        array[0] = 1;
        printf("%d\n",array[0]);
        while(1){
                int count = 0;
                for(int j = length; j>0; j--){
                        int i = 0;
                        if(array[i]>array[i+1]){
                                int temp = array[i];
                                array[i] = array[i+1];
                                array[i+1] = temp;
                                count++;
                        }
                        i++;
                }
               
                if(0 == count){
                        break;
                }
        }
       
}

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[0]);
        bogo_sort(array, length);
        printf("%d\n",array[0]);

        printf("排序后的结果是:");
        for (i = 0; i < length; i++)
        {
                printf("%d ", array[i]);
        }
        putchar('\n');

        end = time(NULL);
        printf("总共耗时:%ld秒\n", end - begin);

        return 0;
}
最佳答案
2022-1-22 17:02:40
本帖最后由 zzzyl 于 2022-1-23 16:25 编辑

你把 int i = 0;放在了for循环中,每次for循环i重置为0,相当于这个程序一直都在交换前两个数据,所以最后排序出问题。

你这里面还有一个问题,在这题里数组的下标最大为8,而for循环最后一次循环中数组下标出现了9,可能会导致程序出错。

最佳答案

查看完整内容

你把 int i = 0;放在了for循环中,每次for循环i重置为0,相当于这个程序一直都在交换前两个数据,所以最后排序出问题。 你这里面还有一个问题,在这题里数组的下标最大为8,而for循环最后一次循环中数组下标出现了9,可能会导致程序出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 17:02:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 zzzyl 于 2022-1-23 16:25 编辑

你把 int i = 0;放在了for循环中,每次for循环i重置为0,相当于这个程序一直都在交换前两个数据,所以最后排序出问题。

你这里面还有一个问题,在这题里数组的下标最大为8,而for循环最后一次循环中数组下标出现了9,可能会导致程序出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-22 17:05:25 | 显示全部楼层
题目说错了,是由小到大。
运行结果都是这样的
8[N(R[6U$H)R9HFPG__4E}V.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 17:20:04 | 显示全部楼层
猴子排序法为何没有用随机?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-22 17:21:40 | 显示全部楼层
傻眼貓咪 发表于 2022-1-22 17:20
猴子排序法为何没有用随机?

因为我不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 17:50:18 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void bogosort(int *arr, size_t n) // 随机排序
{
    // random[a, b) = (rand() % (b-a))+ a; 随机 a 至 b 区间(包括 a 但不包括 b)
    int a, b = 0;
    a = rand()%(n);
    do{
        b = rand()%(n);
    }while(b == a);
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
    /*
    除非每次打印排序结果(花时间),否则很快执行完毕
    for(int i = 0; i < n; i++)
    printf("%d ", arr[i]);
    printf("\n");
    */
}

int isSorted(int arr[], size_t n) // 检查数组是否全部已经排序(由小至大)
{
    for(int i = 0; i < n-1; i++) if(arr[i] > arr[i+1]) return 0; // 未完成排序
    return 1; // 已完成排序
}

int main()
{
    srand((unsigned)time(NULL)); // 随机种子
    int arr[] = {73, 108, 111, 118, 101, 70, 105, 104, 67}, n = sizeof(arr)/sizeof(int);
    time_t begin, end;
    begin = time(NULL);
    while(!isSorted(arr, n)) // 当未完成排序时
    {
        bogosort(arr, n); // 重复随机排序
    }
    end = time(NULL);
    for(int i = 0; i < n; i++)
    printf("%d ", arr[i]);
    printf("\n%ld sec", end-begin);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 23:19:24 | 显示全部楼层
#include <stdio.h>
#include <time.h>



void bogo_sort(int arra[], int length)
{
        //arra[0] = 1;//这是啥意思,不懂
        printf("%d\n",arra[0]);
        /*while(1){
                int count = 0;
                for(int j = length; j>0; j--){
                        int i = 0;
                        if(array[i]>array[i+1]){
                                int temp = array[i];
                                array[i] = array[i+1];
                                array[i+1] = temp;
                                count++;
                        }
                        i++;
                }
               
                if(0 == count){
                        break;
                }
        }*/
                int temp=0;
                for(int i=0;i<length-1;i++)
                {
                        for(int j=i+1;j<=length-1;j++)
                        if(arra[i]>arra[j])
                        {
                                temp = arra[i];
                arra[i] = arra[j];
                arra[j] = temp;
                        }
                }
      
}

int main(void)
{
        int arra[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
        int i, length;
        time_t begin, end;

        begin = time(NULL);

        length = sizeof(arra) / sizeof(arra[0]);
        bogo_sort(arra, length);
        printf("%d\n",arra[0]);

        printf("排序后的结果是:");
        for (i = 0; i < length; i++)
        {
                printf("%d ", arra[i]);
        }
        putchar('\n');

        end = time(NULL);
        printf("总共耗时:%ld秒\n", end - begin);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 14:54:41 | 显示全部楼层

我没有问猴子排序法,就是说我不是想做这道题。我只想知道我这个为什么出不来排序结果。你给我把他答案复制下来干嘛,我不会自己看啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 14:56:34 | 显示全部楼层

那是我当时想知道是不是在另一个函数里不能改数组。忘了删掉抱歉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 15:04:06 | 显示全部楼层

对不起,我看了一下他的,你没复制他的。但我不是想知道原题怎么做,因为我看不懂,我就想知道我哪出问题了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 15:14:34 | 显示全部楼层
豆芽菜丶 发表于 2022-1-23 14:54
我没有问猴子排序法,就是说我不是想做这道题。我只想知道我这个为什么出不来排序结果。你给我把他答案复 ...

兄弟
1.)我只是好奇你的题目明显写着 bogo_sort 就是猴子排序法,多问了一句为什么没有用随机这样也有错?
2.)你想不想做不用告诉我,我只是出于好心,因为你说你不会,我就完全自己写了代码让你参考,谢谢也没有,反而怪我?(我根本不知道你的题目从哪来,怎样复制?这么简单的题目根本不用复制啊,朋友!)
3.)你说不想别人复制答案,自己会看。那么你自己的发帖发问的问题又不清楚,别人怎么清楚知道你想问什么?(别人是你肚子里的虫哦?)

算了,兄弟,你也不用再回复我了。
如果兄弟你觉得你很强,很厉害了,在此非常抱歉,我没有能力帮助你。加油吧兄弟~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 15:25:36 | 显示全部楼层
傻眼貓咪 发表于 2022-1-23 15:14
兄弟
1.)我只是好奇你的题目明显写着 bogo_sort 就是猴子排序法,多问了一句为什么没有用随机这样也有 ...

恶心人你也真是有有一手,我就是个菜逼,你也不用回复我了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-24 15:48:38 | 显示全部楼层
zzzyl 发表于 2022-1-22 17:02
你把 int i = 0;放在了for循环中,每次for循环i重置为0,相当于这个程序一直都在交换前两个数据,所以最后 ...

感谢老哥,我解决了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-29 08:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表