我试图编写一个简单的排序函数来对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, , , , }
{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;
}
我打算编写一个可以对数组进行排序的函数,直到我意识到我无法从数组中删除项目。我在这里不知所措,接下来该怎么办?
答案 0 :(得分:1)
您所描述的是一种称为选择排序的排序算法。反复选择最小元素并产生它。您不必执行删除操作,只需维护一个索引NEXT,告诉您应该写下该编号的下一个位置(最初设置为0)。
所以基本上你通过将位置与NEXT位置的数字交换来模拟POS位置的删除。
天真的实现需要O(n * n)时间,因为你查看列表以找到最小值。更快的选择算法将使用堆结构在O(lg n)时间内获得最小值。