【问题标题】:How to implement the following algorithm to sort a dynamic array in c?如何实现以下算法在c中对动态数组进行排序?
【发布时间】:2015-01-17 17:49:24
【问题描述】:

我试图编写一个简单的排序函数来对 int 数组进行排序,并且我研究了一些简单的算法,例如冒泡排序。我编写了以下代码,它可以按升序对 int 数组进行排序:

void bubble_sort(float *scores, int size) {
    int i = 0,j = 0;
    float container = 0;
    for(i = 0; i < size - 1; i++) {
        for(j = 0; j < size - i - 1; j++) {
            if(scores[j] > scores[j + 1]) {
                container = scores[j];
                scores[j] = scores[j + 1];
                scores[j + 1] = container;
            }
        }
    }
}

然后我想到了我通常如何在一张纸上对一组整数进行排序,我想为什么不编写一个可以做同样事情的代码。但事实证明,它并不像我第一眼所想的那么简单。 我注意到我通常使用一种简单的算法对一组整数进行升序排序,使用以下方法:

假设集合{4, 8, 1, 9, 0}

  • 首先我创建一个空集,其中包含五个空位。 { , , , , }
  • 我在集合中寻找最小值,在本例中为 0。
  • 然后我将它添加到我的新集合中的第一个空白位置{0, , , , }
  • 最后我从原始集合中删除了我使用的元素{4, 8, 1, 9}
  • 我重复上述过程,直到我的原始集合中没有更多元素为止。
  • 现在我有一个有序的集合。

所以我继续写了一个小函数,可以找到数组中的最小值:

int minimum(int *array, int size) {
    int i, min = array[0];
    for(i = 1; i < size; i++) {
        if(array[i] < min) {
            min = array[i];
        }
    }
    return min;
}

我本来打算编写一个函数,它会接受一个数组并对其进行排序,直到我意识到我无法从数组中删除项目。我在这里不知所措,接下来该怎么办?

【问题讨论】:

  • 将数组后面的元素向下复制一步,同时记住改变大小。如果您“删除”最后一个元素,只需减小大小即可。
  • 你发明的算法叫做选择排序。通常要做的就是将最小值与您想要放置的位置交换。
  • c 数组只是内存中的字节,而不是对象,所以不能简单地修改它们

标签: c arrays algorithm sorting


【解决方案1】:

您所描述的是一种称为选择排序的排序算法。反复选择最小元素并产生它。您不必执行删除,只需维护一个索引 NEXT,它会告诉您应该写入数字的下一个位置(最初设置为 0)。

因此,本质上,您通过将位置 POS 处的项目与位置 NEXT 处的数字交换来模拟删除项目。

简单的实现需要 O(n*n) 时间,因为您遍历列表以找到最小值。更快的选择算法将使用堆结构在 O(lg n) 时间内获得最小值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 2013-10-13
    • 2013-05-25
    • 1970-01-01
    • 2012-11-20
    • 2014-08-16
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多