如何实现以下算法对c中的动态数组进行排序?

时间:2015-01-17 17:49:24

标签: c arrays algorithm sorting

我试图编写一个简单的排序函数来对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;
}

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

1 个答案:

答案 0 :(得分:1)

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

所以基本上你通过将位置与NEXT位置的数字交换来模拟POS位置的删除。

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