插入从T Cormen Book中排序

时间:2011-11-21 00:19:47

标签: c++ algorithm sorting insertion-sort

我正在研究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;
}

7 个答案:

答案 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