[英]Selection sort in C. Why?
這是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");
}
它工作正常......但如果我改變一點(在selectionSort函數中):
for (i = 0; i < 10; i++) {
temp = numbers[i];
numbers[i] = numbers[MinNumberIndex(i)];
numbers[MinNumberIndex(i)] = temp;
}
它不起作用......為什么? 它似乎是一樣的。
MinNumberIndex返回的值取決於數組的內容。 當你這樣做時,你正在改變內容:
numbers[i] = numbers[MinNumberIndex(i)];
所以下一個電話:
numbers[MinNumberIndex(i)] = temp;
將/可以存儲到錯誤的單元格,因為MinNumberIndex(i)可以更改。 這會破壞算法,因為您沒有進行適當的交換。
因為MinNumberIndex(i)
每次調用它都會返回不同的值,所以第二個版本實際上不是值交換。
由於MinNumberIndex(i)
返回范圍[i,ItemCount-1]
最小元素的索引,並且您的備用代碼版本修改了兩次調用MinNumberIndex()
之間數組中的范圍,因此您不需要交換元素。
您的備用循環等效於:
for (i=0;i<10;i++)
{
temp = numbers[i];
numbers[i] = numbers[MinNumberIndex(i)];
numbers[i] = temp;
}
更詳細一點,當在for
循環中執行這行代碼時:
numbers[i] = numbers[MinNumberIndex(i)];
它使numbers[i]
在你當時處理的數組范圍中最小,因此下一次MinNumberIndex(i)
,它將返回i
。 和
numbers[i] = temp;
只會將數組恢復到循環頂部的狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.