Quick Sort & Merge Sort

Merge Sort & Quick Sort,这两个排序算法都是利用Divide & Conquer最经典的例子。Merge Sort是先局部有序再整体有序,而Quick Sort是先整体有序再局部有序。由于Merge Sort需要一个拷贝数组的过程,所以速度不及Quick Sort。但两种排序算法中的思想都是非常重要的,在很多题中都会用到,所以在此提及。
Merge Sort: 由于是先局部有序再整体有序,所以要先调用两次mergeSort()之后再调用merge()将已排序的两个子数组合并。还需要注意需要一个辅助数组aux[]以及在merge时,对一个数组已经结束时的处理。
Quick Sort: 由于是先整体有序再局部有序,所以要先调用partision()根据pivot将原数组化为两个字数组,在调用两次quickSort()对子数组进行排序。我们默认left指针所对应的元素即为pivot元素,注意下标的处理。

Merge Sort代码如下:

class Solution:
    """
    @param A: an integer array
    @return: nothing
    """
    def sortIntegers2(self, A):
        aux = self.mergeSort(A)
        for i in range(len(A)):
            A[i] = aux[i]

    def mergeSort(self, A):
        result = []
        if len(A) < 2:
            return A
        mid = int(len(A) / 2)
        left = self.mergeSort(A[:mid])
        right = self.mergeSort(A[mid:])
        i, j = 0, 0
        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                result.append(left[i])
                i += 1
            else:
                result.append(right[j])
                j += 1
        result += left[i:]
        result += right[j:]
        return result

Quick Sort代码如下:

class Solution:
    """
    @param A: an integer array
    @return: nothing
    """
    def sortIntegers2(self, A):
        self.quickSort(A, 0, len(A) - 1)

    def quickSort(self, A, left, right):
        if left >= right:
            return
        low = left
        high = right
        key = A[low]
        while left < right:
            while left < right and A[right] > key:
                right -= 1
            while left < right and A[left] <= key:
                left += 1
            A[left], A[right] = A[right], A[left]
        A[right], A[low] = A[low], A[right]
        self.quickSort(A, low, left - 1)
        self.quickSort(A, left + 1, high)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,086评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,587评论 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,025评论 0 2
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,351评论 0 33
  • 昨天晚上,本意是好的,让她妈妈带她去镇上一年一度的美食节转一转,看看新鲜东西,尝尝佳肴美味。虽然不一定真的那么地道...
    徐徐如秋阅读 2,806评论 3 3