【发布时间】:2021-03-26 09:55:58
【问题描述】:
我正在尝试使用查找数组中最小元素地址的函数编写排序算法:
#include <stdio.h>
int * findMin(int * start,int * end) ///function to return the adress of the smallest array element
{
int *min = start;
int x;
int size = (end - start);
for(x=0; x<size; x++)
{
if (*(start+x)<*min)
min = (start+x);
}
return min;
}
但是在我的排序算法中,由于最后一个元素没有什么可比较的,因此错误地保持原样
void sort(int * start, int * end) ///funtion to sort the array in ascending order
{
int x,temp;
int size = (end - start);
for (x = 0; x <size; x++)
{
if ( *(start+x) > *findMin(start,end))
{
temp = *findMin(start+x,end);
*findMin(start+x,end) = *(start+x);
*(start+x) = temp;
}
}
}
int main()
{
int arr[10]={5,11,3,12,17,25,1,9,14,2};
sort(arr,&arr[9]);
for(int i=0;i<10;i++)
printf("%d ",arr[i]);
printf("\n");
}
我该如何纠正这个问题?
【问题讨论】:
-
在 C 中,无论您使用索引 (
i < n) 还是指针 (p < end),通常都使用包含下限和互斥上限来描述范围。在这两种情况下,上限和下限之间的差异都会为您提供范围的大小。你的函数是这样工作的,但你在main中的调用没有。通过&arr[10]或arr + 10作为上限。 -
这种排序算法的运行时复杂度真的很糟糕。这只是你为了好玩而尝试的东西吗?请注意,对于 10 个元素的数组,您的
findMin函数被调用 27 次,findMin内的循环迭代 171 次。有几个现有的排序例程会执行得非常好,尤其是对于较大的数组。 -
这是一个学校作业,排序算法是讲师决定的,所以我们不能真正使用另一个。在任何情况下,该程序都不应该为任何其他数组输入运行多次,但感谢您提供的信息。
标签: arrays c sorting pointers selection-sort