2011-03-05 124 views
1

這是用C簡單的代碼(選擇排序):C中的選擇排序爲什麼?

#include <stdio.h> 
#include <stdlib.h> 
#define ItemCount 10 

int numbers[ItemCount] = {4,9,3,7,2,5,10,2,12,6};  


int MinNumberIndex(int start) 
{ 
     int i; 
      int minindex = start; 

      for(i=start+1;i<ItemCount;i++) 
        if(numbers[minindex]>numbers[i]) minindex = i; 

       return minindex;  
} 


void SelectionSort() 
{ 

      int i,temp,minindex; 

      for (i=0;i<10;i++) 
      { 
       minindex = MinNumberIndex(i); 

       temp = numbers[i]; 
       numbers[i] = numbers[minindex ]; 
       numbers[minindex ] = temp;                   
      } 


} 

int main() 
{ 

     int i; 

SelectionSort(); 
for(i = 0;i<10;i++) printf("%d\t",numbers[i]); 

system("pause"); 

} 

它好的工作......但如果我改變這樣一點點(在選擇排序功能):

for (i=0;i<10;i++) 
      { 

       temp = numbers[i]; 
       numbers[i] = numbers[MinNumberIndex(i)]; 
       numbers[MinNumberIndex(i)] = temp;                   
      } 

它不工作...爲什麼?它似乎是一樣的。

回答

2

MinNumberIndex返回的值取決於數組的內容。你改變,當你做內容:

​​

所以下次調用:

numbers[MinNumberIndex(i)] = temp; 

會/可以存儲到錯誤小區,因爲MinNumberIndex(我)可以有所改變。這打破了算法,因爲你沒有做適當的交換。

1

因爲MinNumberIndex(i)每次調用它時都會返回不同的值,所以第二個版本實際上不是值交換。

1

由於MinNumberIndex(i)返回最小的元素的索引範圍[i,ItemCount-1]和你的代碼的替代版本修改該範圍內的兩個電話之間的陣列中MinNumberIndex(),你不交換元素。

你的備用環是eqivalent到:

for (i=0;i<10;i++) 
     { 

      temp = numbers[i]; 
      numbers[i] = numbers[MinNumberIndex(i)]; 
      numbers[i] = temp;                   
     } 

在一個更詳細一點,當在for循環執行這行代碼:

​​

它使numbers[i]最小的陣列範圍,那麼在下次調用MinNumberIndex(i)時,它將返回i。並且

numbers[i] = temp; 

只會將數組恢復到它在循環頂部的相同狀態。

相關問題