繁体   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