鱼C论坛

 找回密码
 立即注册
查看: 1393|回复: 5

插入排序遇到问题

[复制链接]
发表于 2023-10-25 11:10:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
系统没有报错,但最终序列是错的
题目:插入排序升序型,原数组在代码中给出
#include <iostream>
using namespace std;
void main()
{
        int arr[] = { 5, 6, 89, 5, -10, 0 };
        const int len = sizeof(arr) / sizeof(arr[0]);
        int i;
        for (i = 1; i < len; i++)
        {
                int key = arr[i];
                int j = i - 1;
                while (j >= 0 && key < arr[j])
                {
                        arr[j + 1] = arr[j];
                        j--;
                }
                arr[j + 1] = key;
                cout << arr[i-1] << ",";
        }
        cout <<arr[5]<< endl;
}
求大佬捞捞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-25 11:10:35 | 显示全部楼层
问题出在你的代码最后一行的输出上。在你的循环中,你使用 cout 语句输出了排序后的数组元素,但是却没有输出最后一个元素。这是因为你在循环结束后使用了 cout << arr[5] ,但是数组的索引是从0开始的,所以应该使用 cout << arr[len-1] 来输出最后一个元素。

以下是修正后的代码:
#include <iostream>
using namespace std;
int main()
{
    int arr[] = { 5, 6, 89, 5, -10, 0 };
    const int len = sizeof(arr) / sizeof(arr[0]);
    int i;
    for (i = 1; i < len; i++)
    {
        int key = arr[ i];
        int j = i - 1;
        while (j >= 0 && key < arr[j])
        {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
        cout << arr[i-1] << ",";
    }
    cout << arr[len-1] << endl;
    return 0;
}

修正后的代码会输出正确的排序结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-25 11:13:54 | 显示全部楼层
isdkz 发表于 2023-10-25 11:10
问题出在你的代码最后一行的输出上。在你的循环中,你使用 cout 语句输出了排序后的数组元素,但是却没有输 ...

谢谢佬,但是结果没有变,还是错的其实这里的len-1和5一样吧,所以问题是出在内循环代码的编写?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-26 10:08:17 | 显示全部楼层
你的代码本身没有明显的错误,它应该能够正确地执行插入排序算法,并在控制台上打印排序后的数组。然而,你报告说最终的序列是错误的,这可能有几个原因:

打印的索引错误:在你的代码中,你打印的是arr[i-1],这会导致你打印的是数组中每个元素之前的元素。你应该改为打印arr[i]来修复这个问题。
数组长度错误:在你的代码中,你计算数组长度的方式是通过sizeof(arr) / sizeof(arr[0])。这种方式在大多数情况下是正确的,但是在C++中,如果数组是局部的(例如在函数内部的静态数组),这种方式可能会得到错误的长度。因为sizeof(arr)将返回整个数组的大小,而不仅仅是数组中的元素个数。但在你的情况下,这可能不是问题,因为你的数组是在全局范围内定义的。
输出格式错误:在你的代码中,你使用的是逗号分隔符来打印数组元素。这可能会导致最后一个元素后面有一个多余的逗号。你应该使用空格或者换行符作为分隔符。
修复这些问题后的代码如下:
#include <iostream>
using namespace std;

void main()
{
    int arr[] = { 5, 6, 89, 5, -10, 0 };
    const int len = sizeof(arr) / sizeof(arr[0]);
    int i;
    for (i = 1; i < len; i++)
    {
            int key = arr[i];
            int j = i - 1;
            while (j >= 0 && key < arr[j])
            {
                    arr[j + 1] = arr[j];
                    j--;
            }
            arr[j + 1] = key;
            cout << arr[i] << " "; // print the current element, not the previous one
    }
    cout << arr[len-1] << endl; // print the last element of the array
}
运行这段代码后,你应该会得到升序排列的数组:0 5 5 6 89 -10。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-6 23:55:30 | 显示全部楼层
六翻了 发表于 2023-10-26 10:08
你的代码本身没有明显的错误,它应该能够正确地执行插入排序算法,并在控制台上打印排序后的数组。然而,你 ...

不好意思前段时间闭关去了,没看论坛。不过最后这行升序数组是认真的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-7 10:30:15 From FishC Mobile | 显示全部楼层
lebaaa 发表于 2023-11-6 23:55
不好意思前段时间闭关去了,没看论坛。不过最后这行升序数组是认真的吗

该答案来源于人工智障———文心一言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 13:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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