快速排序与归并排序

文章介绍了两种经典的排序算法——归并排序和快速排序。归并排序是一种稳定的排序算法,时间复杂度为O(nlogn),适用于大数据量且需要稳定性的场景。快速排序通过分治策略,以O(nlogn)的时间复杂度完成排序,具有较高的效率。文中还提供了快速排序的C++实现代码。
摘要由CSDN通过智能技术生成

一、归并排序

1、概念

归并排序:是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

2、适用说明

当有 n 个记录时,需进行 logn 轮归并排序,每一轮归并,其比较次数不超过 n,元素移动次数都是 n,因此,归并排序的时间复杂度为 O(nlogn)。归并排序时需要和待排序记录个数相等的存储空间,所以空间复杂度为 O(n)。

归并排序适用于数据量大,并且对稳定性有要求的场景。

二、快速排序

快速排序算法通过多次比较和交换来实现排序,其排序流程如下: 

(1)首先设定一个分界值,通过该分界值将数组分成左右两部分。 

(2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。 

(3)然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。 

(4)重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

#include <iostream>

using namespace std;

void Qsort(int arr[], int low, int high){

    if (high <= low) return;

    int i = low;

    int j = high;

    int key = arr[low];

    while (true)

    {

        /*从左向右找比key大的值*/

        while (arr[i] <= key)

        {

            i++;

            if (i == high){

                break;

            }

        }

        /*从右向左找比key小的值*/

        while (arr[j] >= key)

        {

            j--;

            if (j == low){

                break;

            }

        }

        if (i >= j) break;

        /*交换i,j对应的值*/

        int temp = arr[i];

        arr[i] = arr[j];

        arr[j] = temp;

    }

    /*中枢值与j对应值交换*/

    arr[low] = arr[j];

    arr[j] = key;

    Qsort(arr, low, j - 1);

    Qsort(arr, j + 1, high);

}

int main()

{

    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};

    Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/

    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)

        {

        cout << a[i] << " ";

    }

     

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值