心得,搞不懂的算法就动手画一画,一步步来,不要着急。
排序效率在O(nlogn)中效率最高,思想是使用分治法策略把一个序列分为两个子序列,将>基准数的放到该基准数的右边;将<=基准数的放到该基准数的左边
基本步骤:
- 先从序列中取出一个数作为
基准数
; - 分区过程:将把这个数
大的数全部放到它的右边
,小于或者等于它的数全部放到它的左边
; - 递归地对左右子序列进行步骤2,直到个区间只有一个数。
根据大神的解读,可以形象地将此过程描述成挖坑填数+分治法
有一个数组arr={72,6,57,88,60,42,83,73,48,85,}
挖坑填数过程:
- 选取arr[0]为基准数,temp=arr[0]=72,相等于在0这个位置挖了一个坑
- 从j开始向前找一个小于或等于temp的数,找到当j=8这个位置,将arr[8]挖出,填到0这个位置,i++从而在8这个位置出现一个坑
- 这次从i开始向后找一个大于temp的数,找到当i=3这个位置,将arr[3]挖出,填到8这个位置,j–,从而在3这个位置出现了一个新坑
- 再从j这个位置向前找一个小于或等于temp的数,找到当j=5这个位置,将arr[5]挖出,填到3这个位置,i++,从而在5这个位置出现一个新坑
- 由于i==j,且i=j=5,而5的位置恰好是上次挖的坑,因此将temp填入arr[5]
如上图,此时arr[5]之前的数字都小于等于它,arr[5]之后的数字都大于它,那么就在对arr[0…4]和arr[6…9]进行子区间重复上述步骤。
时间复杂度:
- 最好情况下为O(nlogn)
- 最坏情况下为O(n^2)
时间复杂度与基准数的选择密不可分
,因此快速排序是不稳定的
。对于基准数的选择有以下几种方式:
- 固定基准数
- 随机基准数
- 三数取中:使用左端、右端、中心位置上的是哪个元素的中值作为基准元