插入排序打印错误输出
Insertion Sort Printing Wrong Output
我正在尝试使用以下代码对数组进行排序:-
预期的输出应该是一个按升序排列的数组。
但是当我尝试 运行 这段代码时,输出结果是 59(6 次)
我试过调试它在第一个数组声明处添加了一个监视并在第一个 for 循环中添加了一个断点它给出的错误是:-
->->error-begin
A syntax error in expression, near `A[6]={31,41,59,26,41,58}'.
#include<iostream>
using namespace std;
int main()
{
int A[6]={31,41,59,26,41,58};;
int j;
int length = 6;
for(j=2;j<length;j++)
{
int key;
key = A[j];
int i;
i=j-1;
while(i>0 && A[i]>key)
{
A[i+1]=A[i];
i=i-1;
}
A[i+1]=key;
cout<<A[j];
}
return 0;
}
更新:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int A[6] = { 31, 41, 59, 26, 41, 58 };
int temp;
int j;
int length = 6;
for (j = 2; j < length; j++) {
int key;
key = A[j];
int i;
i = j - 1;
while (i > 0 && A[i] > key) {
temp = A[i + 1];
A[i + 1] = A[i];
A[i] = temp;
i = i - 1;
}
A[i + 1] = key;
}
cout << A[j];
return 0;
}
它的工作应该像我知道的冒泡排序
std::sort(std::begin(A), std::end(A));
但我很好奇为什么这段代码不起作用,我已经尝试在 wiki 和其他网站上查找类似代码,但我似乎找不到任何相关内容。
替换:
while(i>0 && A[i]>key)
作者:
while (i >= 0 && A[i] > key)//notice the equality sign!
它只是检查到第 1 个索引,而没有触及第 0 个索引
您可能想像这样打印数组的内容:
for(int i=0;i<6;i++)
cout << A[i]<<" ";
对于初学者这个循环
for (j = 2; j < length; j++) {
^^^^^
初始设置不正确。它不会对只有两个元素的数组进行排序,或者如果第二个元素小于第一个元素,第二个元素将永远不会与第一个元素交换。
这样写语句是正确的
for (j = 1; j < length; j++) {
^^^^^
内循环
while (i > 0 && A[i] > key) {
由于条件 i > 0
, 没有触及元素 A[0]
,因此永远不会检查子条件 A[0] > key
。
与其交换满足条件的每一对元素,不如只复制元素,然后在需要的位置写入"added"元素
程序可以如下所示。
#include <iostream>
int main()
{
int a[] = { 31, 41, 59, 26, 41, 58 };
const size_t N = sizeof(a) / sizeof(*a);
for (int x : a) std::cout << x << ' ';
std::cout << std::endl;
for (size_t i = 1; i < N; i++)
{
int value = a[i];
size_t j = i;
for (; j != 0 && value < a[j - 1]; --j)
{
a[j] = a[j - 1];
}
if (j != i) a[j] = value;
}
for (int x : a) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
程序输出为
31 41 59 26 41 58
26 31 41 41 58 59
我正在尝试使用以下代码对数组进行排序:-
预期的输出应该是一个按升序排列的数组。
但是当我尝试 运行 这段代码时,输出结果是 59(6 次)
我试过调试它在第一个数组声明处添加了一个监视并在第一个 for 循环中添加了一个断点它给出的错误是:-
->->error-begin
A syntax error in expression, near `A[6]={31,41,59,26,41,58}'.
#include<iostream>
using namespace std;
int main()
{
int A[6]={31,41,59,26,41,58};;
int j;
int length = 6;
for(j=2;j<length;j++)
{
int key;
key = A[j];
int i;
i=j-1;
while(i>0 && A[i]>key)
{
A[i+1]=A[i];
i=i-1;
}
A[i+1]=key;
cout<<A[j];
}
return 0;
}
更新:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int A[6] = { 31, 41, 59, 26, 41, 58 };
int temp;
int j;
int length = 6;
for (j = 2; j < length; j++) {
int key;
key = A[j];
int i;
i = j - 1;
while (i > 0 && A[i] > key) {
temp = A[i + 1];
A[i + 1] = A[i];
A[i] = temp;
i = i - 1;
}
A[i + 1] = key;
}
cout << A[j];
return 0;
}
它的工作应该像我知道的冒泡排序
std::sort(std::begin(A), std::end(A));
但我很好奇为什么这段代码不起作用,我已经尝试在 wiki 和其他网站上查找类似代码,但我似乎找不到任何相关内容。
替换:
while(i>0 && A[i]>key)
作者:
while (i >= 0 && A[i] > key)//notice the equality sign!
它只是检查到第 1 个索引,而没有触及第 0 个索引
您可能想像这样打印数组的内容:
for(int i=0;i<6;i++)
cout << A[i]<<" ";
对于初学者这个循环
for (j = 2; j < length; j++) {
^^^^^
初始设置不正确。它不会对只有两个元素的数组进行排序,或者如果第二个元素小于第一个元素,第二个元素将永远不会与第一个元素交换。
这样写语句是正确的
for (j = 1; j < length; j++) {
^^^^^
内循环
while (i > 0 && A[i] > key) {
由于条件 i > 0
, 没有触及元素 A[0]
,因此永远不会检查子条件 A[0] > key
。
与其交换满足条件的每一对元素,不如只复制元素,然后在需要的位置写入"added"元素
程序可以如下所示。
#include <iostream>
int main()
{
int a[] = { 31, 41, 59, 26, 41, 58 };
const size_t N = sizeof(a) / sizeof(*a);
for (int x : a) std::cout << x << ' ';
std::cout << std::endl;
for (size_t i = 1; i < N; i++)
{
int value = a[i];
size_t j = i;
for (; j != 0 && value < a[j - 1]; --j)
{
a[j] = a[j - 1];
}
if (j != i) a[j] = value;
}
for (int x : a) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
程序输出为
31 41 59 26 41 58
26 31 41 41 58 59