464. 整数排序 II
题解
快速排序,我重复复习过快速排序很多次,但是每次都不能写出来,这次算是强行再复习一次吧。
首先我们都知道,快排的过程就是选中一个基准,然后通过在数组前后分别找一个比基准大的和比基准小的进行交换,最后达到数组中在基准左边都比基准小,在右边都比基准大的效果。注意的是此时排序没完成,左边只是比基准小,但还可能是乱序的,我们需要对左右子数组进行重复这个过程,直到数组剩下一个数字位置。
道理都很容易懂,但代码能写出来却很难,每次我都写出来的都是失败的,主要在于最后基准应该放到哪一个位置好。
解法一:
def quickSort(self, A, i, j): if i >= j: return left, right = i, j mid = A[left] while left < right: while left < right and A[right] >= mid: right -= 1 while left < right and A[left] <= mid: left += 1 c = A[left] A[left] = A[right] A[right] = c #这里就是前后找一个比他大,比他小的,然后进行交换 #当循环结束,说明left = right了,说明在left左边都比他小,右边都比他大,只是我们怎么知道这个left位置的一定比他小呢?
#上面的循环,只有当A[left] > mid才会停下来,如果left >= right而跳出来,也说明left的左边全是小的 A[i] = A[left] A[left] = mid self.quickSort(A, i, left-1) self.quickSort(A,left+1, j)
解法二:
def quickSort(self, nums, i, j): if i >= j: return mid = nums[i] a, b = i, j while i < j: while i < j and nums[j] >= mid: j -= 1 nums[i] = nums[j] while i < j and nums[i] <= mid: i += 1 nums[j] = nums[i] nums[i] = mid self.quickSort(nums, a, i-1) self.quickSort(nums, i+1, b)
这个方法有点巧妙,默认第一个为基准。主要是找到一个比基准小的,就马上放到前面第一个位置。然后,我们再从左边找到一个比基准大的,放到刚才已经被放到前面的数字的位置,也就是j,我们就能看到,每一步操作都会有一个数字被重复了,这个重复的数字的位置就是下一个数字需要放的位置,直到最后全部搜索完了, 把基准数字填到这个地方,反正我是有点难想到。