c - 用指针对c中的数组进行排序

标签 c sorting

我正在尝试使用指针而不是数组下标对数组进行从小到大的排序。我不确定问题出在哪里,但是当我运行这段代码时,返回值的顺序与输入时的顺序相同。 find_largest 和 swap 函数都完全按照他们说的做。 selection_sort 函数使用 for 循环从右到左(从大到小,从右到左)对数字进行排序。我已经盯着这个看了一段时间,看起来它应该可以正常工作,但就像我说的,出于某种原因,数字返回的顺序与输入的顺序相同。 这是我的代码:

#include <stdio.h>

#define N 5                             

void selection_sort(int *a, int n);
int *find_largest(int *a, int n);
void swap(int *p, int *q);

int main(void)
{
  int i;
  int a[N];

  printf("Enter %d numbers to be sorted: ", N);
  for (i = 0; i < N; i++)
    scanf("%d", (a+i));

  selection_sort(a, N);

  printf("In sorted order:");
  for (i = 0; i < N; i++)
    printf(" %d", *(a+i));
  printf("\n");

  return 0;
}

void selection_sort(int *a, int n)
{
        int i = 0;
        int *largest;

        for(i = 0; i < n; i++){
                largest = find_largest(a, n-i);
                swap(largest, a+(n-1-i));
        }

}

int *find_largest(int *a, int n){
        int *p = a;
        int *largest = p;
        for(p = a; p < a+n-1; p++){
                if(*(p+1) > *p){
                        largest = (p + 1);
                }
        }
        return largest;
}


void swap(int *p, int *q){
        int *temp;
        temp = p;
        p = q;
        q = temp;
}

最佳答案

您的代码中有两个错误。 一、find_largest函数中的逻辑:

int *find_largest(int *a, int n){
    int *p = a;
    int *largest = p;
    for(p = a; p < a+n-1; p++){
            if(*(p+1) > *largest){     <---- //here you were checking for *(p)
                    largest = (p + 1);
            }
    }
    return largest;

}

另一个是swap函数中的指针:

void swap(int *p, int *q){
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}

关于c - 用指针对c中的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39712866/

相关文章:

c - 当此代码中数组大小未初始化时,为什么 gcc o 不发出警告?

c - 如何让 gcc 在编译时优化带有常量参数的函数调用?

c - C 中的 get_symbol 函数

c - 运行我的 Turbo-C HelloWorld 示例时出错

python - 如何使用 set 维护列表的顺序?

arrays - 创建未排序数组索引的最快方法

c - 如何为C配置eclipse?

c++ - 自定义字符串排序

Java比较方法为Circular Look磁盘算法对数组进行排序

r - 为什么排序比 R 中的排序函数慢?