利用工作之余加强自己算法方面的学习,作此记录以便日后查阅,同时欢迎高手拍砖指点。
---- sherwin 2012-08-14
快速排序算法是诸多排序算法中效率较高的,其时间复杂度为O(N*logN)。
快速排序算法采用了一种分治的策略,故又称分治算法,其基本的算法思想如下:
1. 先从要排序的数组中取出一个数x(通常为数组的第1个数据),作为基数来将数组分成两块
2. 将整个数组分为两大块:小于或等于x的数放在x的左边,大于的放在x的右边
3. 再分别对这两大块重复第2步的操作,只至每个块只有1个数。
整几个图吧,更方便理解。
若有数组array[12]如下: 分别用两个指针low和high表示数组的低位和高位
根据上面快速排序算法的基本思想,
第一步:先取数组的第1个元素80作为基准数。那么就有:
low = 0, high = 11, tmp = array[low] = 80;
第二步: 1> 从high开始向左找一个比tmp:80 小或相等的数,并将其移动到array[low]的位置。此时array[low]即80这个数已经放到tmp中了,所以无需担心覆盖的问题。如下图
2> 再从low向右找一个比tmp:80 大的数,并将其移到high当前所在位置,如下图:
3> 再从high向左找一个比tmp:80小的数,并将其移动到low当前所在位置,如下图:
4> 再从low向右找一个比tmp:80 大的数,并将其移到high当前所在位置,如下图:
5> 再从high向左找一个比tmp:80小的数,并将其移动到low当前所在位置,如下图:
6> 再从low向右找一个比tmp:80 大的数,当low == high时,将tmp放到low(high)所在位置,即完成第二部分的分块工作,如下图
第三步:前面已经完成了将数组分成两大块的工作, 这步的工作其实和第二步是一样的,分别递归的对两个块执行第二步的操作。
代码部分:
待续。。。。。。