c语言课本上的练习题数组元素快速排序,让小弟我用指针而不是用整数来跟踪数组的位置
求助c语言课本上的练习题数组元素快速排序,让我用指针而不是用整数来跟踪数组的位置
数组元素快速排序的题
原题
可是运行出来就是不对咧?
这是我改的
程序有点繁琐,读下来真是辛苦大家了!
出了什么问题呢?
------------------------------------------------------------------------------
可用分不多了大家见谅啊
------解决思路----------------------
作为循环、判断条件的关系表达式
改成
因为这不是比较数的大小,是比较左右指针是否交叉相遇了
------解决思路----------------------
你没看明白程序的每一步实现什么功能有什么作用,怎么可能对了 ,if (low >= high) return;这一步的原意是如果数组为空或者只有一项直接返回主函数输出数组
这是我改的程序,你可以参考一下,我只是把split()函数里的数组下标操作改成指针操作了
int split(int a[], int low, int high)
{
int part_element = a[low];
int *l,*h;
for (;;) {
l=&a[low];
h=&a[high];
while (low < high && part_element <= *h)
{high--;
h--;}
if (low >= high) break;
*l++ = *h;
while (low < high && *l <= part_element)
{low++;
l++;}
if (low >= high) break;
*h-- = *l;
}
*h = part_element;
return high;
}
数组元素快速排序的题
原题
/*********************************************************我是这样想的,把要传递跟踪用的整数的地方用地址替代
* From C PROGRAMMING: A MODERN APPROACH, Second Edition *
* By K. N. King *
* Copyright (c) 2008, 1996 W. W. Norton & Company, Inc. *
* All rights reserved. *
* This program may be freely distributed for class use, *
* provided that this copyright notice is retained. *
*********************************************************/
/* qsort.c (Chapter 9, page 207) */
/* Sorts an array of integers using Quicksort algorithm */
#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;
}
可是运行出来就是不对咧?
这是我改的
/*********************************************************
* From C PROGRAMMING: A MODERN APPROACH, Second Edition *
* By K. N. King *
* Copyright (c) 2008, 1996 W. W. Norton & Company, Inc. *
* All rights reserved. *
* This program may be freely distributed for class use, *
* provided that this copyright notice is retained. *
*********************************************************/
/* qsort.c (Chapter 9, page 207) */
/* Sorts an array of integers using Quicksort algorithm */
#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, 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;
}
程序有点繁琐,读下来真是辛苦大家了!
出了什么问题呢?
------------------------------------------------------------------------------
可用分不多了大家见谅啊
------解决思路----------------------
作为循环、判断条件的关系表达式
*low < *high
改成
low < high
因为这不是比较数的大小,是比较左右指针是否交叉相遇了
------解决思路----------------------
你没看明白程序的每一步实现什么功能有什么作用,怎么可能对了 ,if (low >= high) return;这一步的原意是如果数组为空或者只有一项直接返回主函数输出数组
这是我改的程序,你可以参考一下,我只是把split()函数里的数组下标操作改成指针操作了
int split(int a[], int low, int high)
{
int part_element = a[low];
int *l,*h;
for (;;) {
l=&a[low];
h=&a[high];
while (low < high && part_element <= *h)
{high--;
h--;}
if (low >= high) break;
*l++ = *h;
while (low < high && *l <= part_element)
{low++;
l++;}
if (low >= high) break;
*h-- = *l;
}
*h = part_element;
return high;
}