2012-10-17 36 views
2

我的插入排序的實現似乎與排序第一個元素的例外。我在這裏有一個小測試用例。任何人都可以告訴我我的算法有什麼問題嗎?插入排序不排序的第一個元素?

#include <iostream> 
#include <string> 
#include <stdlib.h> 
using namespace std; 



void Insert(int *S, int k) 
{ 
     int key = S[k]; 
     int j = k-1; 
     while(j>0 && S[j] > key) 
     { 
       S[j+1] = S[j]; 
       j--; 
     } 

     S[j+1] = key; 
} 


void Insertionsort(int S[], int n) 
{ 
     if(n>1) 
       Insertionsort(S,n-1); 
     Insert(S,n); 

} 

int main() 
{ 
     srand (time(NULL)); 
     int S1_8[8]; 
     for(int i=0; i<8; i++) 
       S1_8[i] = rand()%100; 

     Insertionsort(S1_8,8); 

     for(int i=0; i<8; i++) 
     { 
       cout << S1_8[i] << endl; 
     } 

     return 0; 
} 
+0

它並不能說明問題,但肯定是有問題在最後一次迭代中,當調用「Insert(S,8)」時。根據將要訪問S [8]的'Insert'函數的定義,這是一個不存在的元素。 – jogojapan

回答

5

首次Insert被調用時,它被傳遞int key = S[8];

S[8]是數組邊界內不

作出這樣的

void Insertionsort(int S[], int n) 
{ 
     if(n>1) 
       Insertionsort(S,n-1); 
     Insert(S,n-1); 

} 

此外,在您的病情時,它必須是

while(j>=0 && S[j] > key) 

Link to Code

+0

+1,但是你也將while循環中的條件改爲了'j> = 0'而不是'j> 0'。這是正確的,但應在答案中提及並解釋。 – jogojapan

+0

謝謝你們兩位。如果我想計算由'插入'進行的組件智能比較的次數,我是否會在while循環內或while循環外部增加一個計數器? – Zack

+0

在while循環中。 –