arrays - 交换排序C数组中的最后一个元素问题
问题描述
我正在尝试使用查找数组中最小元素的地址的函数编写排序算法:
#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");
}
我该如何纠正?
解决方案
此声明中的表达式
int size = (end - start);
没有给出数组的确切大小。至少你应该写
int size = end - start + 1;
但是,将指针传递给数组的最后一个元素而不是指向数组最后一个元素之后的内存的指针并不是一个好主意。在这种情况下,您可以指定一个空范围,因为 start 等于 end。
此外,如果函数接受两个指针,则无需在循环中引入用作索引的中间变量。
而这个代码片段
temp = *findMin(start+x,end);
*findMin(start+x,end) = *(start+x);
*(start+x) = temp;
效率很低。
这是一个演示程序,展示了如何实现这些功能。
#include <stdio.h>
int * findMin( const int * start, const int * end ) ///function to return the adress of the smallest array element
{
const int *min = start;
if ( start != end )
{
while ( ++start != end )
{
if ( *start < *min ) min = start;
}
}
return ( int * )min;
}
void selection_sort( int *start, int *end ) ///funtion to sort the array in ascending order
{
for ( ; start != end; ++start )
{
int *min = findMin( start, end );
if ( min != start )
{
int tmp = *start;
*start = *min;
*min = tmp;
}
}
}
int main(void)
{
int arr[] = { 5, 11, 3, 12, 17, 25, 1, 9, 14, 2 };
const size_t N = sizeof( arr ) / sizeof( *arr );
for ( const int *p = arr; p != arr + N; ++p )
{
printf( "%d ", *p );
}
putchar( '\n' );
selection_sort( arr, arr + N );
for ( const int *p = arr; p != arr + N; ++p )
{
printf( "%d ", *p );
}
putchar( '\n' );
return 0;
}
程序输出为
5 11 3 12 17 25 1 9 14 2
1 2 3 5 9 11 12 14 17 25
推荐阅读
- c++ - 为什么我不能取消引用这个迭代器?
- c++ - 理解带有位移的右移运算符
- elasticsearch - 如何从具有特定请求值的搜索查询中排除结果?
- smooch - Smoosh iOS SDK startConversation 不创建用户?
- javascript - 如何从消息中接收角色
- laravel - 如何使用 v-form by api 将购物车中的数据转换为表单?
- java-8 - java8如何从通用对象中动态获取字段
? - arrays - 搜索reactjs后更新数组的状态
- css - 网格系统在 PC 中完美运行,但在移动设备中无法运行 - 它在移动设备上显示相同的 PC 视图
- java - GUI 上只打印第一行