簡體   English   中英

選擇排序在C.為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM