2016-12-13 92 views
0

我的插入排序将每个数字排序,但第一个数字。它从第二个元素到最后一个元素进行排序,但它从不包含第一个元素。我的插入排序有什么问题。我将此代码基于CLRS本书的伪代码,我无法调试它出现的问题。为什么我的插入排序没有得到第一个元素?

#include <iostream> 
void InsertSort(int data[], int length) 
{ 
    //std::cout<<length<<std::endl; 
    for(int j = 1; j < length; j++) 
    { 
     int key = data[j]; 
     int i = j - 1; 
     while(i > 0 && data[i] > key) 
     { 
      data[i + 1] = data[i]; 
      i--; 
     } 
     data[i+1] = key; 
    } 
    for(int x = 0; x < length; x++) 
    { 
     std::cout<<data[x]<<" "; 
    } 
    std::cout<<std::endl; 
} 


int main(int argc, const char * argv[]) 
{ 
    // insert code here... 
    //std::cout << "Hello, World!\n"; 

    int foo [] = { 18, 2, 77, 0, 12071 , 21, 45, 98, 54, 80}; 
    InsertSort(foo, 10); 


    return 0; 
} 

这里是我的输出:18 0 2 21 45 54 77 80 98 12071

这里是一本书

for j = 2 to A.length 
    key - A[j] 
    //Insert A[j] into the sorted sequence A[1.. j - 1] 
    i = j -1 
    while i > 0 and A[i] > key 
     A[i+1] = A[i] 
     i = i -1 
    A[i+1] = key 

收到我的伪如果有复制权的问题,我将取消伪代码。

正如你所看到的,我的第一个元素没有排序,并且由于某种原因从未被排序。我的代码有什么问题?

+0

'而(I> 0 ...' – user2357112

+0

它应该是在我> = 0 – user1470901

回答

4

更改while循环

while(i >= 0 && data[i] > key) 

下面是更新后的代码:

#include <iostream> 
void InsertSort(int data[], int length) 
{ 
    //std::cout<<length<<std::endl; 
    for(int j = 1; j < length; j++) 
    { 
     int key = data[j]; 
     int i = j - 1; 
     while(i >= 0 && data[i] > key) 
     { 
      data[i + 1] = data[i]; 
      i--; 
     } 
     data[i+1] = key; 
    } 
    for(int x = 0; x < length; x++) 
    { 
     std::cout<<data[x]<<" "; 
    } 
    std::cout<<std::endl; 
} 


int main(int argc, const char * argv[]) 
{ 
    // insert code here... 
    //std::cout << "Hello, World!\n"; 

    int foo [] = { 18, 2, 77, 0, 12071 , 21, 45, 98, 54, 80}; 
    InsertSort(foo, 10); 


    return 0; 
} 
+0

你?它是正确的,它现在可以工作,但是伪代码现在被认为是错误的吗?伪代码表示状态(i> 0),我没有错误地输入它 – user1470901

+1

@ user1470901:伪代码使用从1开始索引的序列 – user2357112

+0

Ah I看,非常感谢! – user1470901

相关问题