所以我对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;
}
答案 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);
/* ... */
}