快排(快速排序)
Python实现快速排序算法 (推荐)
排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数(这只是个专用名词)。为了方便,我们一般选择第 1 个数字作为基准数(其实选择第几个并没有关系)。接下来我们需要把这个待排序的数列中小于基准数的元素移动到待排序的数列的左边,把大于基准数的元素移动到待排序的数列的右边。这时,左右两个分区的元素就相对有序了;接着把两个分区的元素分别按照上面两种方法继续对每个分区找出基准数,然后移动,直到各个分区只有一个数时为止。
快速排序的操作是这样的:首先从数列的右边开始往左边找,我们设这个下标为 i,也就是进行减减操作(i--),找到第 1 个比基准数小的值,让它与基准值交换;接着从左边开始往右边找,设这个下标为 j,然后执行加加操作(j++),找到第 1 个比基准数大的值,让它与基准值交换;然后继续寻找,直到 i 与 j 相遇时结束,最后基准值所在的位置即 k 的位置,也就是说 k 左边的值均比 k 上的值小,而 k 右边的值都比 k 上的值大。
快排代码:
def quick_sort(numbs, left, right): if left >= right: return numbs pivot = numbs[left] i = left j = right while i < j: while i < j and numbs[j] >= pivot: j -= 1 numbs[i] = numbs[j] while i < j and numbs[i] <= pivot: i += 1 numbs[j] = numbs[i] numbs[j] = pivot quick_sort(numbs, left, i-1) quick_sort(numbs, i+1, right) return numbs if __name__=="__main__": lists=[30,24,5,58,2,3,18,36,12,42,39] print(quick_sort(lists,0,len(lists)-1))
运行结果:[2, 3, 5, 12, 18, 24, 30, 36, 39, 42, 58]
最好时间复杂度:O(nlongn)。 <<== 每次选的基准正好把当前数组等长地分为两个子数组。
最坏时间复杂度:O(n^2)。 <<== 每次选的基准正好是当前数组最小或最大值。
平均时间复杂度:O(nlongn).