搜索
查看: 2060|回复: 4
打印 上一主题 下一主题

如果你实在看不懂快速排序

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-11 02:46:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include <stdio.h>

  2. int ary[10], temp_ary[10];

  3. void easy_qsort(int, int);

  4. int main()
  5. {
  6.         int i;
  7.         for(i=0; i!=10; ++i)
  8.                 scanf("%d", &ary[i]);

  9.         easy_qsort(0, 10);
  10.         for(i=0; i!=10; ++i)
  11.                 printf("%d ", ary[i]);

  12.         return 0;
  13. }

  14. void easy_qsort(int begin, int end)
  15. {
  16.         int front, back;
  17.         int pivot;
  18.         int i;
  19.         if(begin + 1 >= end)
  20.                 return;

  21.         pivot = ary[begin];

  22.         front = begin;
  23.         back = end - 1;

  24.         for(i=begin+1; i!=end; ++i)
  25.                 if(ary[i] <= pivot)
  26.                         temp_ary[front++] = ary[i];
  27.                 else
  28.                         temp_ary[back--] = ary[i];
  29.         temp_ary[front] = pivot;

  30.         for(i=begin; i!=end; ++i)
  31.                 ary[i] = temp_ary[i];
  32.         easy_qsort(begin, front);
  33.         easy_qsort(front+1, end);                 
  34. }
复制代码


快速排序的流程是
如果待排序的数组长度小于等于1,返回
选择轴点,然后把小于轴点的放在轴点左边,大于轴点的放在轴点右边
对轴点两边的数据进行排序

其中难写的部分在于第二部分,如果是其他部分有问题就回头多看几遍书

用一个辅助数组很容易做到第二部分,例如数据
2 7 3 9 5
选择中间点3作为轴点,那么扫描一遍待排序的数据
2比3小,放在辅助数组的最左边;
7比3大,放在辅助数组的最右边;
……

然后再把数据拷贝回来

这样的快速排序叫做非原位快速排序,需要原始数据2倍的内存空间,另外又要多拷贝一次,但是时间复杂度是不变的

真正想把快速排序实现好其实是非常困难的事情,一般可以考虑用标准库中的qsort
沙发
发表于 2014-10-12 10:59:34 | 只看该作者
{:soso_e121:}谢谢大神!
板凳
发表于 2015-11-20 19:42:06 | 只看该作者
有时候快排只讲一个思想,有时候懂就是懂了,不懂的说了也是不是很懂
地板
发表于 2015-11-20 20:01:41 | 只看该作者
我建议想看明白这个先把二叉树学熟悉,
5#
发表于 2015-11-20 20:02:48 | 只看该作者
至少得写的出先中后三种遍历,因为可以稍微明白啥是递归
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表