2013-05-10 84 views
0

课本中的作业问题“修改第9.6节的qsort.c程序,使低,高和中指向数组元素而不是整数,指针分裂并不需要返回一个指针整数。”C编程修改快速排序

qsort.c代码:

#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); 
    printf("Low"); 
    printf("%d", low); 
    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; 
} 

我试图在解决方法:

#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; 
int zero, nminus; 
printf("Enter %d numbers to be sorted: :", N); 
for (i=0; i<N; i++) 
    scanf("%d", &a[i]); 
    zero=0; 
    nminus=N-1; 
    quicksort(a, &zero, &nminus); 

    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; 
    int splitt; 
    if (low >= high) return; 
    splitt = split(a, low, high); 
    middle = &splitt; 

    quicksort(a, low, middle - 1); 
    quicksort(a, middle + 1, high); 
} 

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

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

     while (low1 < high1 && a[low1] <= part_element) 
      low1++; 
     if (low1 >= high1) break; 
     a[high1--] = a[low1]; 

    } 

    a[high1] = part_element; 
    return high1; 
} 

我是新来的C语言编程和我不能确定如何正确地做这个工作方案。这种尝试成功地进行了调试,但是它只是在不对其进行排序的情况下吐出输入。任何帮助表示赞赏。

回答

0

也许这样

#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, &a[0], &a[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 = *low; 

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

     while (low < high && *low <= part_element) 
      low++; 
     if (low >= high) break; 
     *high-- = *low; 

    } 

    *high = part_element; 
    return high; 
} 

对应表

when sizeof(int) is 4 
address | array a | index of array 
a(top) | a[0] |  0 
a + 4 | a[1] |  1 
a + 8 | a[2] |  2 
... 

&a[1] is (a + 4) : address of a[1] 
*(a+4) is a[1] : (a+4) is a + 1*sizeof(int), *(a+1) in c 
+0

非常感谢,这使得更多的意义 – 2013-05-11 17:34:23

+0

不客气。 – BLUEPIXY 2013-05-11 17:52:27

1

如果拿顶,复制和粘贴,下面的变化真的那么必须进行:

每一个你比较高,低或中等的时间,只是不停的 - 或+ +然后解除引用它。例如:

a[high1--] = a[low1]; 

*(high--) = *low. 

然后,所有你需要做的就是通过指针高,低,中等左右。

1

它说:

分割功能将需要返回一个指针不是整数。 (int a [],int * low,int * high);

返回一个指针不是整数。 int * split(int a [],int * low,int * high);