Quick Sort & Merge Sort

本文详细比较了快速排序和归并排序两种经典排序算法。介绍了它们的时间复杂度、空间复杂度、排序稳定性及分治思想的不同。通过具体实现代码,展示了快速排序的原地特性与归并排序的稳定性和额外空间需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两种排序均采用分治的思想:quick sort先整体有序,再局部有序。归并排序先局部有序,再整体有序。

目录:

  • quick sort 和 merge sort 的比较
  • quick sort
  • merge sort

1. quick sort 和 merge sort 的区别于联系

1). 时间复杂度:都是O(nlogn),但是快速排序是平均O(nlogn),归并排序是最好最坏都是O(nlogn)

quick sort的平均时间复杂度的计算:如有3个数字,则有6种排列情况,则期望的时间复杂度是:1/6 * (每种排列的时间之和)

2). 空间复杂度:快速排序耗费O(1)的额外空间,归并排序不得不耗费O(n)的额外空间

3). 排序稳定性:快速排序是不稳定的排序算法。归并排序是稳定的排序算法

4). 分治的思想:快速排序先整体有序再局部有序。归并排序先局部有序再整体有序。

T(n) = 2 * T(n/2) + O(n)

2. quick sort -快速排序的原理和实现

1). 以某个元素为基准,记录其为key,然后小于等于key的在左边,大于等于key的在右边。为了使划分更均匀。

2). 有以下几个要点:绿色标出!

class Solution {
public:
    /*
     * @param A: an integer array
     * @return: 
     */
    void sortIntegers(vector<int> &A) {
        // write your code here
        if(A.size()==0){
            return;
        }

        quicksort(A, 0, A.size()-1);
    }

    void quicksort(vector<int> &A, int start, int end){
        if(start >= end){
            return;
        }

        int left = start, right = end;
        //1.pivot,A[start],A[end]。取start或end做pivot,升序和降序是不好的情况,而选择random更好,但是调用random的开销大,折中之后用中点的数做pivot
        //get value not index
        int pivot = A[(start+end) / 2];

        //2.left<=right not left < right
        while(left<=right){
            //3. A[left] < pivot not <=。此处是为了较均匀的分为左右两部分
            while(left<=right && A[left] < pivot){
                left++;
            }
            while(left <= right && A[right] > pivot){
                right--;
            }
            if(left <= right){
                int tmp = A[left];
                A[left] = A[right];
                A[right] = tmp;
                left++;
                right--;
            }
        }

        quicksort(A, start, right);
        quicksort(A, left, end);
    }
};

3. merge sort - 归并排序的原理和实现

1).

class Solution {
public:
    /*
     * @param A: an integer array
     * @return: 
     */
    void sortIntegers(vector<int> &A) {
        // write your code here
        if(A.size()==0){
            return;
        }

        vector<int> temp(A.size(),0);
        mergeSort(A, 0, A.size()-1, temp);
    }

    void mergeSort(vector<int> &A, int start, int end, vector<int> &temp){
        if(start >= end){
            return;
        }

        mergeSort(A, start, (start+end)/2, temp);
        mergeSort(A, (start+end)/2+1, end, temp);
        merge(A,start,end, temp);
    }

    void merge(vector<int> &A, int start, int end, vector<int> &temp){
        int mid = (start+end)/2;
        int lstart = start;
        int rstart = mid + 1;
        int index = lstart;

        while(lstart<=mid && rstart<=end){
            if(A[lstart] < A[rstart]){
                temp[index++] = A[lstart++];
            }
            else{
                temp[index++] = A[rstart++];
            }
        }

        while(lstart <= mid){
            temp[index++] = A[lstart++];
        }
        while(rstart<=end){
            temp[index++] = A[rstart++];
        }

        for(int i = start;i<=end;++i){
            A[i] = temp[i];
        }
    }
};
### 快速排序算法工作原理 快速排序是一种高效的排序算法,采用分治策略来把一个序列分为较小较大的两个子序列,然后递归地排序两个子序列。基本过程如下: - **选择基准**:从数列中挑出一个元素作为基准(pivot)。 - **分区操作**:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于其最终位置。这称为一次划分操作。 - **递归排序**:递归地将小于基准值元素的子数列大于基准值元素的子数列排序。 通过上述步骤,整个数组变得有序[^3]。 ### Python实现快速排序算法 下面是一个Python版本的快速排序实现例子: ```python def quick_sort(arr): if len(arr) &lt;= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x &lt; pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x &gt; pivot] return quick_sort(left) + middle + quick_sort(right) # 测试代码 if __name__ == &quot;__main__&quot;: test_array = [3, 6, 8, 10, 1, 2, 1] print(&quot;原始数组:&quot;, test_array) sorted_array = quick_sort(test_array) print(&quot;排序后的数组:&quot;, sorted_array) ``` 这段程序展示了如何利用列表推导式简洁地完成快速排序的操作,并且提供了一个简单的测试案例用于验证函数的功能[^1]。 ### PHP实现快速排序算法 同样地,在PHP中也可以按照相同逻辑编写快速排序算法: ```php &lt;?php function quickSort($array); if ($length &lt;= 1) { return $array; } $left = $right = array(); $pivot = $array[floor($length / 2)]; foreach ($array as $value) { if ($value === $pivot) continue; if ($value &lt; $pivot) { $left[] = $value; } else { $right[] = $value; } } return array_merge(quickSort($pivot), quickSort($right)); } // 测试代码 $testArray = [3, 6, 8, 10, 1, 2, 1]; echo &quot;原始数组: &quot;; print_r($sortedArray = quickSort($testArray); echo &quot;排序后的数组: &quot;; print_r($sortedArray); ?&gt; ``` 此段PHP脚本实现了同样的功能并提供了相应的测试数据以展示效果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值