C ++选择按结构数组排序

时间:2012-03-03 08:24:52

标签: c++ sorting pointers selection structure

我正在阅读一本C ++书籍,我对其中一个挑战问题感到困惑。我正在研究指针,在这个特殊的问题中,我需要对一个结构数组(使用指针)进行排序,其中包含一个学生姓名字符串和两倍的分数。在排序之后,结构的数据成员仍然需要匹配,显然(即正确的名称仍然需要与他们的分数相符)。

这就是我的问题所在。到目前为止,我已经按照升序顺序排列得分,但这些名字都混乱了。我无法找出原因,部分原因是因为我仍在努力完全理解指针以及如何使用它们。我可以正确地进行冒泡排序,保持名称与他们的分数,但不是选择排序。任何帮助将不胜感激。

以下是我选择排序的功能:

void selection_sort(Student *ptr, int size) // selection sort - having some problems
{
  int start,
    min_index,
    min_value;

  for (start = 0; start < (size - 1); start++) {
    min_index = start;
    min_value = (ptr+start)->score;
    for (int index = start+1; index < size; index++) {
      if ( (ptr+index)->score < min_value) {
    min_value = (ptr+index)->score;
    min_index = index;
      }
    }
    // the following line is where, i think, the problem is, but i haven't
    // been able to figure out the solution, despite trying numerous approaches
    *(ptr+min_index) = *(ptr+start);
    (ptr+start)->score = min_value;
  }
}

这就是我所拥有的。我对排序算法也不是很好,对我来说这对我来说都是新手,所以我希望它不会被搞砸。如果知识渊博的人能指出我正确的方向,那就太棒了。

3 个答案:

答案 0 :(得分:4)

首先,我想给您一个提示:您可以使用*(ptr+min_index)而不是语法ptr[min_index],它将具有相同的效果。我相信这个版本更自然。

第二 - 你的问题。您应该交换ptr[min_index]ptr[start],而不是将其中一个的值复制到另一个。 那不是:

*(ptr+min_index) = *(ptr+start);
(ptr+start)->score = min_value;

写下这个:

Student temp = ptr[start];
ptr[min_index] = ptr[start];
ptr[start] = temp;

或者,如果您使用的是c ++,只需使用交换功能:

std::swap(ptr[min_index], ptr[start]);

为什么要交换而不是你现在正在做什么?那么,你应该保留ptr[min_index]中的所有字段,以便能够将它们分配给ptr [start]。

希望这会有所帮助。

答案 1 :(得分:1)

我认为你应该在标准库中使用memcpy函数......

还有一件事:

*(ptr+min_index) = *(ptr+start); 

这一行似乎覆盖了数据,但不应该按原样交换它们。

答案 2 :(得分:0)

C ++的第一课:在C ++中,我们有运算符重载,所以像这样的行:

 *(ptr+min_index) = *(ptr+start); 
如果您的学生类在其成员属性中有任何指针,则

可能有意义。

并且您必须使用交换,而不仅仅是分配。