我想要做的是在下面获得所需的输出。我已经尝试在quicksort的开头打印,我得到了一些正确的值,但我觉得我的整个方法都没有用,所以我需要一些帮助。
级别partitionNumber d [3a_spaces x1 x3 ... xn 3b_spaces]
其中:
级别是递归级别。
partitionNumber 是用于创建分区的数字。
d 是'>'如果partitionNumber大于的元素 否则是分区'<'。
3a_space 是每个元素的3个空格字符的集合 分区开始前的数组。
x1 x3 ... xn 是分区中的数字集。注意:打印 这些数字使用“%3d”格式描述符。
3b_spaces 是每个元素的一组3个空格字符 分区结束后的数组。
期望的输出:
1 0 [23 13 82 33 51 17 45 75 11 27 ]
2 51> [27 13 33 23 17 45 11 ]
3 23> [11 13 17 ]
3 23> [11 13 17 ]
3 23< [ 33 45 27 ]
4 45> [ 27 33 ]
4 45> [ 27 33 ]
3 23< [ 27 33 45 ]
2 51> [11 13 17 23 27 33 45 ]
2 51< [ 82 75 ]
2 51< [ 75 82 ]
1 0 [11 13 17 23 27 33 45 51 75 82 ]
我的输出:
1 0 [23 13 82 33 51 17 45 75 11 27 ]
2 51> [27 13 33 23 17 45 11 ]
3 23> [11 13 17 ]
2 13> [11 13 17 ]
3 23< [ 33 45 27 ]
4 45> [ 27 33 ]
3 27? [ 27 33 ]
2 45> [ 27 33 45 ]
1 23> [11 13 17 23 27 33 45 ]
2 51< [ 82 75 ]
1 82> [ 75 82 ]
0 51> [11 13 17 23 27 33 45 51 75 82 ]
#include<stdio.h>
int inputLine[10];
void quicksort(int v[], int left, int right, int level, int previousPivotPoint, char d);
int main()
{
int v[] = { 23, 13, 82, 33, 51, 17, 45, 75, 11, 27 };
quicksort(v, 0, 9, 0, -1, ' ');
return 0;
}
void swap(int v[], int i, int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
void quicksort(int v[], int left, int right, int level, int previousPivotPoint, char d)
{
int i, last;
level++;
if (previousPivotPoint > v[left]) d = '>';
else if (previousPivotPoint < v[left]) d = '<';
if (left >= right)
{
level--;
return;
}
if (previousPivotPoint == -1)
{
printf("%d 0 [", level);
} else
{
printf("%d %d%c [", level, previousPivotPoint, d);
}
previousPivotPoint = v[(left + right) / 2];
d = '?';
for (i = 0; i < 10; i++)
{
if (i > right || i < left)
{
printf(" ");
} else
{
printf("%d ", v[i]);
}
}
printf("]\n");
swap(v, left, (left + right) / 2);
last = left;
for (i = left + 1; i <= right; i++)
{
if (v[i] < v[left])
{
last++;
swap(v, last, i);
}
}
swap(v, left, last);
quicksort(v, left, last - 1, level, previousPivotPoint, d);
quicksort(v, last + 1, right, level, previousPivotPoint, d);
level--;
if (previousPivotPoint > v[left]) d = '>';
else if (previousPivotPoint < v[left]) d = '<';
printf("%d %d%c [", level, previousPivotPoint, d);
previousPivotPoint = v[(left + right) / 2];
for (i = 0; i < 10; i++)
{
if (i > right || i < left)
{
printf(" ");
} else
{
printf("%d ", v[i]);
}
}
printf("]\n");
}
答案 0 :(得分:2)
我注意到几件事:
i = left
开始 - 这不会打印整个原始底层数组。考虑总是遍历数组并打印它们,检查您是否在当前阵列中。void swap(int v[], int i, int j);
。那是怎么回事? 注意:显然是来自K&amp; R.作为个人品味的问题,我不是乐谱的最大粉丝,但是你可以做得比跟K&amp; R更糟糕,是吗?答案 1 :(得分:1)
没有时间深入研究你的代码,但这里有一些 的东西。
你应该做的第一件事就是将硬编码的10
替换为
#define
常数。
如果没有设置d
的值,那就不足为奇了,
因此所有的空间。另外,为什么要d
全局?
您的打印循环应遍历整个列表,以便部分输入 括号的大小始终相同。