千家信息网

归并排序和快速排序(三十二)

发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,上节我们学习了冒泡排序和希尔排序,本节我们继续学习归并排序和快速排序。1、归并排序:将两个或两个以上的有序序列合并成一个新的有序序列。如下那么既然有 2 路归并,便会有多路归并。将 3 个有序序列归并
千家信息网最后更新 2025年02月06日归并排序和快速排序(三十二)

上节我们学习了冒泡排序和希尔排序,本节我们继续学习归并排序和快速排序。

1、归并排序:将两个或两个以上的有序序列合并成一个新的有序序列。如下

那么既然有 2 路归并,便会有多路归并。将 3 个有序序列归并为一个新的有序序列,称为 3 路归并;将 N 个有序序列归并为一个新的有序序列,成为 N 路归并;将多个有序序列归并为一个新的有序序列,称为多路归并。

下来我们来看看 2 路归并示例,如下图所示

我们来看看它是怎样实现的,如下所示

它是通过比较两个序列的大小来一个个进行比对的。下来我们来看看归并排序的具体实现,具体源码如下

#ifndef SORT_H#define SORT_H#include "Object.h"namespace DTLib{class Sort : public Object{private:    Sort();    Sort(const Sort&);    Sort& operator= (const Sort&);    template     static void Swap(T& a, T& b)    {        T c(a);        a = b;        b = c;    }    template < typename T >    static void Merge(T src[], T helper[], int begin, int mid, int end, bool min2max)    {        int i = begin;        int j = mid + 1;        int k = begin;        while( (i <= mid) && (j <= end) )        {            if( min2max ? (src[i] < src[j]) : (src[i] > src[j]) )            {                helper[k++] = src[i++];            }            else            {                helper[k++] = src[j++];            }        }        while( i <= mid )        {            helper[k++] = src[i++];        }        while( j <= end )        {            helper[k++] = src[j++];        }        for(i=begin; i<=end; i++)        {            src[i] = helper[i];        }    }    template < typename T >    static void Merge(T src[], T helper[], int begin, int end, bool min2max)    {        if( begin < end )        {            int mid = (begin + end) / 2;            Merge(src, helper, begin, mid, min2max);            Merge(src, helper, mid+1, end, min2max);            Merge(src, helper, begin, mid, end, min2max);        }    }public:    template < typename T >    static void Merge(T array[], int len, bool min2max = true)    {        T* helper = new T[len];        if( helper != NULL )        {            Merge(array, helper, 0, len-1, min2max);        }        delete[] helper;    }};}#endif // SORT_H

测试代码如下

#include #include "Sort.h"using namespace std;using namespace DTLib;int main(){    int array[] = {9, 3, 2, 4, 1, 5, 7, 6, 9, 8};    Sort::Merge(array, 10);    for(int i=0; i<10; i++)    {        cout << array[i] << endl;    }}

我们来看看运行结果

我们将上面的参数变为 false,让它从大到小来进行排序,运行结果如下图所示

2、快速排序:任取序列中的某个数据元素作为基准将整个序列划分为左右两个子序列其中左侧子序列中所有元素都小于或等于基准元素,右侧子序列中所有元素都大于基准元素,基准元素排在这两个子序列中间。分别对这两个子序列重复进行划分,知道所有的数据元素都排在相应位置上为止。

快速排序示例如下

我们来看看具体是怎么实现的,如下所示

我们看到在选取一个数据元素作为基准元素,大于它的放在右边,小于它的放在左边。再次在左侧子序列中选取一个元素作为基准元素,以此类推。我们来看看具体源码的实现,如下

#ifndef SORT_H#define SORT_H#include "Object.h"namespace DTLib{class Sort : public Object{private:    Sort();    Sort(const Sort&);    Sort& operator= (const Sort&);    template     static void Swap(T& a, T& b)    {        T c(a);        a = b;        b = c;    }    template < typename T >    static int Partition(T array[], int begin, int end, bool min2max)    {        T pv = array[begin];        while( begin < end )        {            while( (begin < end) && (min2max ? (array[end] > pv) : (array[end] < pv)) )            {                end--;            }            Swap(array[begin], array[end]);            while( (begin < end) && (min2max ? (array[begin] <= pv) : (array[begin] >= pv)) )            {                begin++;            }            Swap(array[begin], array[end]);        }        array[begin] = pv;        return begin;    }    template < typename T >    static void Quick(T array[], int begin, int end, bool min2max)    {        if( begin < end )        {            int pivot = Partition(array, begin, end, min2max);            Quick(array, begin, pivot-1, min2max);            Quick(array, pivot+1, end, min2max);        }    }public:    template < typename T >    static void Quick(T array[], int len, bool min2max = true)    {        Quick(array, 0, len-1, min2max);    }};}#endif // SORT_H

测试代码就是将上面的归并排序换成快速排序,我们先来看看不加参数,默认情况下,从小到大进行排序的情况,运行结果如下

再来看看加参数 false,从大到小的排列情况,结果如下所示

那么功能已经实现了。通过今天对归并排序和快速排序的学习,总结如下:1、归并排序需要额外的辅助空间才能完成,空间复杂度为 O(n);2、归并排序的时间复杂度为 O(n*logn),是一种稳定的排序法;3、快速排序通过对递归的方式对排序问题进行划分;4、快速排序的时间复杂度为 O(n*logn),是一种不稳定的排序法。

排序 序列 元素 有序 两个 基准 结果 复杂 参数 复杂度 情况 数据 学习 运行 代码 时间 源码 示例 空间 面的 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 中石油管道局设计院网络安全 郑州轨道网络技术 网络安全管理原则解释 联想x系列服务器售后 河北新一代软件开发服务价格优惠 数据库的安全性内容 写数据库的环境 数据库第一范式是行不同吧 办公楼服务器空调要求 企业服务器权限管理 宝德服务器PR2510G阵列 删除已有数据库创建新的数据库 盘锦医院管理系统软件开发公司 数据库改进完成便民服务再升级 php循环遍历数据库源码 45岁转行做软件开发 沈阳网络安全课程高品质的教学 定制网络技术服务口碑推荐 企业服务器不能开机怎么办 三级目录如何建数据库表 北京中医药大学数据库拟采购价格 网络安全防护体系设计基本原则 目前软件开发用什么软件 大学专业计算机网络技术学什么 计算机软件开发应用技术 网络技术岗视频 45岁转行做软件开发 益城软件开发有限公司 巩向明软件开发工作室怎么样 潮汕软件开发价位
0