我正在尝试使用以下代码对数组进行排序: -
预期输出应该是一个按升序排序的数组。
但是当我试图运行此代码时,输出结果为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和其他网站以获得类似的代码,但我似乎无法找到任何相关内容。
答案 0 :(得分:2)
替换:
while(i>0 && A[i]>key)
由:
while (i >= 0 && A[i] > key)//notice the equality sign!
直到第一个索引才检查,而没有触及第零个索引
您可能想要打印数组的内容,如下所示:
for(int i=0;i<6;i++)
cout << A[i]<<" ";
答案 1 :(得分:2)
对于初学者来说这个循环
for (j = 2; j < length; j++) {
^^^^^
初始设置不正确。如果第二个元素小于第一个元素,它不会对只有两个元素的数组进行排序,或者第二个元素永远不会与第一个元素交换。
写出像
这样的语句是正确的 for (j = 1; j < length; j++) {
^^^^^
内循环
while (i > 0 && A[i] > key) {
由于条件A[0]
,不会触及元素i > 0
,因此永远不会检查子条件A[0] > key
。
最好不要交换满足条件的每对元素来复制元素,然后写入&#34;添加&#34;元素处于所需位置。
程序可以按以下方式查看。
#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