鱼C论坛

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

插入排序遇到问题

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

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

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

x
系统没有报错,但最终序列是错的
题目:插入排序升序型,原数组在代码中给出
  1. #include <iostream>
  2. using namespace std;
  3. void main()
  4. {
  5.         int arr[] = { 5, 6, 89, 5, -10, 0 };
  6.         const int len = sizeof(arr) / sizeof(arr[0]);
  7.         int i;
  8.         for (i = 1; i < len; i++)
  9.         {
  10.                 int key = arr[i];
  11.                 int j = i - 1;
  12.                 while (j >= 0 && key < arr[j])
  13.                 {
  14.                         arr[j + 1] = arr[j];
  15.                         j--;
  16.                 }
  17.                 arr[j + 1] = key;
  18.                 cout << arr[i-1] << ",";
  19.         }
  20.         cout <<arr[5]<< endl;
  21. }
复制代码

求大佬捞捞
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

以下是修正后的代码:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     int arr[] = { 5, 6, 89, 5, -10, 0 };
  6.     const int len = sizeof(arr) / sizeof(arr[0]);
  7.     int i;
  8.     for (i = 1; i < len; i++)
  9.     {
  10.         int key = arr[ i];
  11.         int j = i - 1;
  12.         while (j >= 0 && key < arr[j])
  13.         {
  14.             arr[j + 1] = arr[j];
  15.             j--;
  16.         }
  17.         arr[j + 1] = key;
  18.         cout << arr[i-1] << ",";
  19.     }
  20.     cout << arr[len-1] << endl;
  21.     return 0;
  22. }
复制代码


修正后的代码会输出正确的排序结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢佬,但是结果没有变,还是错的其实这里的len-1和5一样吧,所以问题是出在内循环代码的编写?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  3. void main()
  4. {
  5.     int arr[] = { 5, 6, 89, 5, -10, 0 };
  6.     const int len = sizeof(arr) / sizeof(arr[0]);
  7.     int i;
  8.     for (i = 1; i < len; i++)
  9.     {
  10.             int key = arr[i];
  11.             int j = i - 1;
  12.             while (j >= 0 && key < arr[j])
  13.             {
  14.                     arr[j + 1] = arr[j];
  15.                     j--;
  16.             }
  17.             arr[j + 1] = key;
  18.             cout << arr[i] << " "; // print the current element, not the previous one
  19.     }
  20.     cout << arr[len-1] << endl; // print the last element of the array
  21. }
复制代码

运行这段代码后,你应该会得到升序排列的数组:0 5 5 6 89 -10。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思前段时间闭关去了,没看论坛。不过最后这行升序数组是认真的吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

该答案来源于人工智障———文心一言
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 00:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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