本文最后更新于 169 天前,其中的信息可能已经有所发展或是发生改变。
快排的平均时间复杂度为O(nlogn),最坏时间复杂度为O(n²),空间复杂度为O(1),快排是不稳定的。快排适用于乱序数组,排序快。快排面临的最坏情况就是排序一个已经排序好的数组。
快排的基本概念:选取一个元素作为基准,然后调整元素位置,使得基准左边的元素都小于他,右边的都大于他,然后递归执行,即可排序完整个数组。每一趟基本流程:
- 选取最左侧元素作为基准(pivot)
- 两个指针,一个left初始指向最左边,right初始指向最右边
- 如果left等于right,说明这一趟排序完成,将该位置的元素值改为pivot,进行下一趟。否则执行流程4
- right指向元素与left不重合或者大于等于pivot时,right会一直向左边移动,直到不满足条件时,停止移动(为了确保right右边的都是大于等于pivot的元素)
- 将left指向元素的值改为right指向元素
- left指向元素与right不重合或者小于pivot时,left会一直向右边移动,直到不满足条件时停止移动(为了确保left左边的元素都是小于pivot)
- 将right指向元素的值改为left指向元素
- 跳转到流程3
以书上的例题举例,排序49,38,65,97,76,13,27,49
第一趟就详细说明吧。
先选取49作为pivot
然后是right指针先往左移动,先判断49不会小于49,然后左移发现27小于49,终止移动。
然后赋值之后数组变成27(left指向),38,65,97,76,13,27(right指向),49
再然后left右移,移到65的时候停下,然后修改right指向元素的值。此时数组为27,38,65(left指向),97,76,13,65(right指向),49
再然后,left和right还没重合,继续right左移。移动到13的时候修改left指向元素的值,此时数组为27,38,13(left指向),97,76,13(right指向),65,49
然后left右移到97的时候修改right指向元素的值。此时数组为27,38,13,97(left指向),76,97(right指向),65,49
然后right左移,直到和left重合,此时将该位置元素改为pivot,数组为:27,38,13,49(left和right指向),76,97,65,49
那么继续递归排序27,38,13和76,97,65,49这两个子数组。
以此类推,直到排序完整个数组。