0

我正在实施选择排序算法步骤。

我做了两个函数:一个用于查找最小值的索引,另一个用于 selection_sort。

输出不正确。我发现了错误,但我不知道如何解决这个问题。错误在 find_min 函数中。我想我必须更新索引?

请帮忙。

int find_min(int ar[], int size)
{
    int index = 0;
    bool found = false;
    for(int i = 1; i < size; i++)
    {
        if(ar[index] > ar[i])
        {
            index = i;
            found = true;
        }
    }

    if (found)
    {
        return index;
    }
    else
        return -1;

}

void selection_sort(int arr[], int size)
{
    int loc;
    for(int count = 0; count < size; count++)
    {
        loc = find_min(arr, size - count);
        if (loc >= 0)
        {
            exchange(arr[count], arr[loc]);
        }
    }
}
4

2 回答 2

0

考虑以下代码:

#include <iostream>

using namespace std;

// Exchanges two values in array arr, specified by indices i and j
void exchange(int arr[], int i, int j)
{
    int t = arr[i];
    arr[i] = arr[j];
    arr[j] = t;
}

// Prints an array arr of length len
void print_array(int arr[], int len)
{
    for(int i=0; i<len; i++)
    {
        cout << arr[i] << "  ";
    }
    cout << endl;
}

// Finds the index of the minimum value in array arr of length len between indices
//    init and the last element (len-1)
int find_min(int arr[], int len, int init)
{
    int index = init;

    for(int i = init; i < len; i++)
    {
        if(arr[index] > arr[i])
        {
            index = i;
        }
    }

    return index;
}

// Sort the array using the selection sort algorithm
void selection_sort(int arr[], int len)
{
    int loc;
    // We don't need the last iteration when there is only a single element left
    for(int pos = 0; pos < (len-1); pos++)
    {
        cout << "Before iteration " << pos << " array is: ";
        print_array(arr, len);

        loc = find_min(arr, len, pos);
        cout << "  Minimum between indices " << pos << " and " << (len-1) << " is: ";
        cout << arr[loc] << " at index " << loc << endl;

        if (loc != pos)
        {
            cout << "  Exchanging indices " << loc << " and " << pos << endl;
            exchange(arr, pos, loc);
        }
        else
        {
            cout << "  No exchange necessary this iteration. " << endl;
        }

        cout << "After iteration " << pos << " array is: ";
        print_array(arr, len);

        // Print an extra line newline, space things out a bit
        cout << endl;
    }
}


int main(void)
{
    int arr[] = {2,6,7,3,1,8};

    selection_sort(arr, 6);
}

输出:

迭代前 0 数组为:2 6 7 3 1 8
  索引 0 和 5 之间的最小值是:索引 4 处的 1
  交换索引 4 和 0
迭代后 0 数组为:1 6 7 3 2 8

迭代前 1 数组为: 1 6 7 3 2 8
  索引 1 和 5 之间的最小值是:索引 4 处的 2
  交换索引 4 和 1
迭代后 1 数组为: 1 2 7 3 6 8

在迭代 2 数组之前是:1 2 7 3 6 8
  索引 2 和 5 之间的最小值为:索引 3 处的 3
  交换索引 3 和 2
迭代 2 后数组为:1 2 3 7 6 8

在迭代 3 数组之前是:1 2 3 7 6 8
  索引 3 和 5 之间的最小值为:索引 4 处为 6
  交换索引 4 和 3
迭代 3 后数组为:1 2 3 6 7 8

迭代前 4 数组为:1 2 3 6 7 8
  索引 4 和 5 之间的最小值为:索引 4 处为 7
  本次迭代无需交换。
迭代 4 后数组为:1 2 3 6 7 8
于 2013-09-21T20:46:29.977 回答
0

修复你的find_min功能

int find_min(int ar[],int s, int size) // s denotes the start index
{
    int index = s-1; //take min pos as start
    bool found = false;
    for(int i = s; i < size; i++)
    {
        if(ar[index] > ar[i])
        {
            index = i;
            found = true;
        }
    }

    if (found)
    {
        return index;
    }
    else
        return -1;
}

现在使用: loc = find_min(arr, count+1,size);

直到countarr 已经排序

这里

于 2013-09-21T20:46:46.807 回答