我正在研究Cormen的“算法导论”一书,我从伪代码创建了以下内容。但是,Array的前两个元素似乎没有排序。我无法发现错误(可能是因为它迟到了)。所以我想知道是否有人能从第一眼看到。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int input;
cout << "Enter length of desired array." << "\n";
cin >> input;
cout << "\n";
int A [input];
//Populate and print the Array.
for(int i=0; i<input; i++){
A[i] = rand()%99-1;
cout << A[i] << " ";
}
cout << "\n";
//Insertion sort.
for(int j=2; j<input; j++){ //Iterate through the Array.
int key = A[j]; //Store the current element into key.
int i = j-1; //Iterator for while loop.
while(i>0 && A[i]>key){ //Loop to insert A[j] into the sorted sequence.
A[i+1] = A[i]; //Move the element.
i=i-1; //New value of i.
A[i+1] = key; //Update the key
}
}
for(int i=0; i<input; i++){
cout << A[i] << " ";
}
return 0;
}
答案 0 :(得分:10)
我没有太仔细看,但我认为本书的伪代码使用基于索引的索引,而对于C语言(或大多数现代语言)的编码,您需要将其调整为基于零的索引。
主要嫌疑人是
for(int j=2; j<input; j++)
您可能希望从1而不是2开始。
终止条件
while(i>0 && A[i]>key)
可能还需要更改以确保您高于-1而不是0。
修改强>
仔细观察之后,我很确定你做还必须调整while
。
您当然也应该检查类似的逐个问题的所有上限。
答案 1 :(得分:5)
更改为for (int j = 1; ...)
答案 2 :(得分:2)
实际上你的代码是正确的,但你的for循环初始化中存在问题。插入排序的伪代码是:
for j ←1 to length(A)-1
key ← A[ j ]
> A[ j ] is added in the sorted sequence A[0, .. j-1]
i ← j - 1
while i >= 0 and A [ i ] > key
A[ i +1 ] ← A[ i ]
i ← i -1
A [i +1] ← key
实际上你的代码没有考虑数组的第一个元素。它只是从数组的第二个元素中盯着你得到那种类型的结果。
只需将j的初始化更改为1即可正确运行。
答案 3 :(得分:0)
您可以使用此代码,我已更正您的错误
#include<iostream>
#include<stdlib.h>
#include<cstdlib>
using namespace std;
int main(){
int input;
cout<< "Enter length of desired array";
cin>>input;
cout<<"\n";
int A[input];
for(int i = 0 ;i <input ; i++)
{
A[i] = rand() % 100;
cout<<A[i] << "\t";
}
cout<<"\n";
for(int j =1; j<input ; j++)
{ int i;
int key = A[j];
i = j-1;
while( i >=0 && A[i] > key)
{
A[i+1] = A[i];
i = i-1;
A[i+1] = key;
}
}
for(int i = 0 ;i <input ; i++)
{
cout<<A[i] << "\t";
}
}
答案 4 :(得分:0)
看一下用java翻译的CLRS插入排序算法。
int a[] = {5,2,4,3,1};
int key;
int i;
for(int j = 0; j < 5; j++)
{
key = a[j];
i = j - 1;
while(i>=0 && a[i]>key)
{
a[i+1]= a[i];
i--;
}
a[i+1] = key;
System.out.println("i in for loop "+i);
for(int k=0; k<a.length;k++)
{
System.out.print(a[k]+" ");
}
}
答案 5 :(得分:0)
SELECT (r.net_revenue * p.percent)/100, p.product
FROM products p, revenue r;
答案 6 :(得分:0)
答案在这里,请先阅读 Don Roby 的解释。
start j = 1
和 while 循环应该有 i >= 0