【问题标题】:Selection sort algorithm using pointer arithmetic使用指针算法的选择排序算法
【发布时间】:2022-02-04 23:52:44
【问题描述】:

我需要使用选择排序算法和指针算法对数组元素进行升序排序。

这意味着以下(使用指针算法):

  • 找到未排序数组中的最小元素;
  • 将找到的最小元素与第一个元素交换
  • 重复直到数组结束
  • 打印排序数组

代码:

#include <stdio.h>
void swap(double **pp, double **qq) {
  double *temp = *pp;
  *pp = *qq;
  *qq = temp;
}
void sortArray(double arr[], int n) {
  double *q, *min;
  q = min = arr;
  while (min > arr + n) {
    while (q < arr + n) {
      if (*q < *min) 
        min = q;
        q++;
      }
      min++;
      swap(&min, &q);
  }
}
void writeSorted(double arr[], int n) {
  double *qq = arr;
  while (qq < arr + n) {
    printf("%g ", *qq);
    qq++;
  }
}
int main() {
  double arr[4] = {2.1, 4.23, 3.67, 1.5};
  int n = 4;
  sortArray(arr, n);
  writeSorted(arr, n);
  return 0;
}

此代码打印相同的未排序数组。你知道怎么解决吗?

【问题讨论】:

  • 您是否尝试过调试您的代码?例如,通过使用 调试器 逐条执行它,同时监控变量及其值?
  • 作为提示:交换指向局部变量的指针可能不是您想要做的。
  • 找到最小值是正确的,交换和打印是错误的
  • swap(&amp;min, &amp;q) 交换 minq(它们都是局部变量),但它不会交换 arr 中的任何内容。您需要交换数组中的相应值。
  • 交换不需要双重间接 - 直接接受指向 double 的普通指针和 double 值(当指针指向数组时,数组将被更改)。

标签: arrays c function pointers


【解决方案1】:

swap的作用有个错误:你要交换元素,而不是对应的指针。

此外,每个指针的定义和作用存在混淆。
特别是,跟踪指向下一次迭代开始的指针非常重要。

#include <stdio.h>
void swap(double *pp, double *qq) {
  double temp = *pp;
  *pp = *qq;
  *qq = temp;
}
void sortArray(double arr[], size_t n) {
  double *start = arr;
  while (start < arr + n) {
      double *q = start + 1;
      double *min = start;
      while (q < arr + n) {
          if (*q < *min) min = q;
          q++;
      }
    swap (start, min);
    start++;
  }
}
void writeArray(double arr[], size_t n) {
  double *qq = arr;
  while (qq < arr + n) {
    printf("%g ", *qq);
    qq++;
  }
  printf ("\n");
}
int main() {
  double arr[] = {2.1, 4.23, 3.67, 1.5};
  size_t n = sizeof(arr)/sizeof(*arr);
  writeArray (arr, n);
  sortArray(arr, n);
  writeArray(arr, n);
  return 0;
}

此外,我不知道你对这个练习有什么限制。即使使用指针,也可以进行一些简化。例如,对于打印功能:

void writeArray(double arr[], size_t n) {
  while (n--) {
    printf("%g ", *arr++);
  }
  printf ("\n");
}

【讨论】:

  • @codproe 欢迎您。
猜你喜欢
  • 2017-02-27
  • 2021-02-06
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多