分析C中的快速排序

时间:2011-04-05 13:53:32

标签: c

我想要做的是在下面获得所需的输出。我已经尝试在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");

}

2 个答案:

答案 0 :(得分:2)

我注意到几件事:

  1. 如果level将是一个模块化变量而不是传递给快速排序例程,那么它就不可能永远失效。考虑将其合并到快速排序功能的签名中。
  2. i = left开始 - 这不会打印整个原始底层数组。考虑总是遍历数组并打印它们,检查您是否在当前阵列中。
  3. 您在快速排序例程中发出FORWARD声明void swap(int v[], int i, int j);。那是怎么回事? 注意:显然是来自K&amp; R.作为个人品味的问题,我不是乐谱的最大粉丝,但是你可以做得比跟K&amp; R更糟糕,是吗?

答案 1 :(得分:1)

没有时间深入研究你的代码,但这里有一些 的东西。

你应该做的第一件事就是将硬编码的10替换为 #define常数。

如果没有设置d的值,那就不足为奇了, 因此所有的空间。另外,为什么要d全局?

您的打印循环应遍历整个列表,以便部分输入 括号的大小始终相同。