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,我们就能看到,每一步操作都会有一个数字被重复了,这个重复的数字的位置就是下一个数字需要放的位置,直到最后全部搜索完了, 把基准数字填到这个地方,反正我是有点难想到。

  

posted on 2018-03-28 12:01  usp10  阅读(107)  评论(0编辑  收藏  举报

导航