gpt4 book ai didi

arrays - C 数组排序中交换最后一个元素的问题

转载 作者:行者123 更新时间:2023-12-01 23:37:59 25 4
gpt4 key购买 nike

我正在尝试使用查找数组中最小元素地址的函数编写排序算法:

#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;

然而,将指针传递给数组的最后一个元素而不是将指针传递给数组最后一个元素之后的内存并不是一个好主意。在这种情况下,您可以指定一个空范围,因为开始等于结束。

此外,如果函数接受两个指针,则无需引入用作循环索引的中间变量。

还有这段代码

        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

关于arrays - C 数组排序中交换最后一个元素的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65311402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com