C编程:指针算术而不是索引操作

时间:2015-05-03 20:59:35

标签: c pointers indexing operations

所以我对C编程很新,对于一个项目,我给了一个quicksort程序,我将在下面链接,并要求使用指针算术重新编写quicksort程序,即没有任何索引操作。我该怎么做呢?我在代码中如何实现指针算术而不是索引操作? 我的代码在这里:http://ideone.com/ku9EhU

#include<stdio.h>
#define N 10

void quicksort(int a[], int low, int high);
int split(int a[], int low, int high);

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

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

  quicksort(a, 0, N - 1);

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

  return 0;
}

void quicksort(int a[], int low, int high)
{
  int middle;

  if (low >= high) return;
  middle = split(a, low, high);
  quicksort(a, low, middle - 1);
  quicksort(a, middle + 1, high);
}

int split(int a[], int low, int high)
{
  int part_element = a[low];

  for (;;) {
    while (low < high && part_element <= a[high])
      high--;
    if (low >= high) break;
    a[low++] = a[high];

    while (low < high && a[low] <= part_element)
      low++;
    if (low >= high) break;
    a[high--] = a[low];
  }

  a[high] = part_element;
  return high;
}

3 个答案:

答案 0 :(得分:1)

数组索引访问a[i]等于指针算术*(a + i)

答案 1 :(得分:0)

首先为什么要做指针算术? 指针算术只是一个[i] = *(a + i),它不会给你的程序带来性能提升

我认为,对于性能改进,您需要的是参考,因为这是最好的做法。检查修改后的代码。

#include<stdio.h>
#define N 10

void quicksort(int a[], int low, int high);
int split(int a[], int low, int high);

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

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

  quicksort(&a[0], 0, N - 1);

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

  return 0;
}

void quicksort(int *a, int low, int high)
{
  int middle;

  if (low >= high) return;
  middle = split(a, low, high);
  quicksort(a, low, middle - 1);
  quicksort(a, middle + 1, high);
}

int split(int *a, int low, int high)
{
  int part_element = a[low];

  for (;;) {
    while (low < high && part_element <= a[high])
      high--;
    if (low >= high) break;
    a[low++] = a[high];

    while (low < high && a[low] <= part_element)
      low++;
    if (low >= high) break;
    a[high--] = a[low];
  }

  a[high] = part_element;
  return high;
}

答案 2 :(得分:0)

我想知道这里的目标是否重新定义排序功能:

quicksort(int *low, int *high)
{
int *middle;
    if((high - low) == 0)
        return;
    middle = low + ((high - low)/2);
    /* ... */
}