用c++实现快速排序、最大子段和问题

6.2.2 快速排序

【问题】快速排序(quick sort)的分治策略如下(图6-5)。
(1)划分:(选定一个记录作为轴值,以轴值为基准将整个序列划分为两个子序列,轴值的位置在划分的过程中确定,并且左侧子序列的所有记录均小于或等于轴值,右侧子序列的所有记录均大于或等于轴值。
(2) 求解子问题:分别对划分后的每一个子序列进行递归处理。
(3) 合并:由于对子序列的排序是就地进行的,所以合并不需要执行任何操作。

【想法】首先对待排序记录序列进行划分,刻分的轴值应该遵循平衡子问题的原则,使划分后两个子序列的长度尽量相等。轴值的选择有很多方法,例如,可以随机选出一个记录作为轴值,从而期望划分是较平衡的。假设以第一个记录作为轴值,图6-6给出了、个划分的例子(黑体框代表轴值)。

        以轴值为基准将待排序序列划分为两个子序列后,对每一个子序列分别进行递归处理。图6-7所示是一个快速排序的完整的例子。

【算法实现】设函数Partition实现对序列r[first]~r[end]进行划分,函数QuickSort实现快速排序,程序如下。

#include <iostream>
using namespace std;


int Partition(int r[ ], int first, int end)
{
int temp, i = first, j = end;
while (i < j)
{
while (i < j && r[i] <= r[j]) j--; //右侧扫描
if (i < j)
{
temp = r[i]; r[i] = r[j]; r[j] = temp; //将较小记录交换到前面
i++;
}
while (i < j && r[i] <= r[j]) i++; //左侧扫描
if (i < j)
{
temp = r[i]; r[i] = r[j]; r[j] = temp; //将较大记录交换到后面
j--;
}
}
return i; //返回轴值记录的位置
}

void QuickSort(int r[ ], int first, int end) //快速排序
{
if (first < end)
{
int pivot = Partition(r, first, end); //划分,pivot是轴值的位置
QuickSort(r, first, pivot-1); //对左侧子序列进行快速排序
QuickSort(r, pivot+1, end); //对右侧子序列进行快速排序
}
}
int main( )
{
int i, n = 8, r[8] = {8,3,2,6,7,1,5,4};
    QuickSort(r, 0, n-1);

    for (i = 0; i < n; i++)
        std::cout << r[i] << " ";  // 打印排序后的元素

    std::cout << std::endl;

    return 0;
}

 

【算法分析】 最好情况下,每次划分对一个记录定位后,该记录的左侧子序列与右侧子序列的长度相同。在具有n个记录的序列中,一次划分需要对整个待划分序列扫描一遍,所需时间为O(n),则有:


        最坏情况下,待排序记录序列正序或逆序,每次划分只得到一个比上一次划分少一个记录的子序列(另一个子序列为空)。此时,必须经过n-1次递归调用才能把所有记录定位,而且第i趟划分需要经过n-i次比较才能找到第i个记录的位置,因此,时间复杂度为:

        平均情况下,设轴值记录的关键码第k小(1<=k<=n),则有:

        这是快速排序的平均时间性能,可以用归纳法证明,其数量级也为O(nlog以2为底n)。
        由于快速排序是递归执行的,需要一个工作栈来存放每一层递归调用的必要信息,栈
的最大容量与递归调用的深度一致。最好情况下要进行[log以2为底n]次递归调用,栈的深度为O(log,n);最坏情况下,要进行n-1次递归调用,栈的深度为O(n);平均情况下,栈的深度为O(log以2为底n).

6.3.1  最大子段和问题

应用实例
        国际期货市场某种商品在某个月的第1,2,...,31天的价格涨幅分别记为a1, a2,...,a31,若某天的价格下跌,这天的涨幅就是负值。如果想知道在连续哪些天,该商品的价格具有最高涨幅,究竟涨了多少,这个问题就可以抽象为最大子段和问题。

【算法实现】 最大子段和问题是按照位置进行划分的,设变量 center 表示序列的中间位置,数组a[n]存放整数序列,程序如下。

#include <iostream>
using namespace std;


int MaxSum(int a[ ], int left, int right)
{
int sum = 0, midSum = 0, leftSum = 0, rightSum = 0;
int i, center, s1, s2, lefts, rights;
if (left == right) //如果序列长度为1,直接求解
sum = a[left];
else
{
center = (left + right)/2; //划分
leftSum = MaxSum(a, left, center); //对应情况①,递归求解
rightSum = MaxSum(a, center+1, right); //对应情况②,递归求解
s1 = 0; lefts = 0; //以下对应情况③,先求解s1
for (i = center; i >= left; i--)
{
lefts += a[i];
if (lefts > s1) s1 = lefts;
}
s2 = 0; rights = 0; //再求解s2
for (i = center + 1; i <= right; i++)
{
rights += a[i];
if (rights > s2) s2 = rights;
}
midSum = s1 + s2; //计算情况③的最大子段和
if (midSum < leftSum) sum = leftSum; //合并解,取较大者
else sum = midSum;
if (sum < rightSum) sum = rightSum;
}
return sum;
}
int main( )
{
  int max, n = 6, r[6] = {-20, 11, -4, 13, -5, -2};
    max = MaxSum(r, 0, n - 1);
    cout << "最大子段和是:" << max << endl;
    return 0;

}
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/704363.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux连接文件那点事

什么是连接文件 将一个文件和另一个文件建立联系&#xff0c;分为硬链接和软连接&#xff08;符号连接&#xff09;。 硬链接 Linux中&#xff0c;所有的文件都有一个inode&#xff0c;这个东西就是文件的ID号&#xff0c;硬链接的方式就是通过这个inode来产生新的文件名来建…

公共命名空间和RHP

概述 RHP的全称是&#xff1a;the little Robot that Helped me Program&#xff0c;帮我编程序的小机器人。 RHP必然存在&#xff0c;C语言的宏、C的模板&#xff0c;都是RHP&#xff1b;更复杂的例子&#xff0c;是lex和yacc&#xff0c;它们是制作程序的程序&#xff0c;也…

ChatGPT官网5月14日凌晨1点发布会推出最新GPT4o大模型,贾维斯时刻要来了?

就在今天北京时间2024年5月14日凌晨1点中&#xff0c;OpenAI进行了发布会&#xff0c;这次发布会的内容炸裂&#xff0c;一起来看下吧&#xff01; GPT4o多模态大模型发布 首先公开的是GPT4o多模态大模型的发布&#xff0c;相较于GPT-4turbo速度更快&#xff0c;更便宜。我刚开…

Redis数据结构-RedisObject

1.7 Redis数据结构-RedisObject Redis中的任意数据类型的键和值都会被封装为一个RedisObject&#xff0c;也叫做Redis对象&#xff0c;源码如下&#xff1a; 1、什么是redisObject&#xff1a; 从Redis的使用者的角度来看&#xff0c;⼀个Redis节点包含多个database&#xff…

【Linux】常用指令、热键与权限管理

一、常用指令 &#xff08;1&#xff09;ls 功能&#xff1a;列出指定目录下的所有子目录与文件 用法&#xff1a;ls &#xff08;选项&#xff09; &#xff08;目录或文件名&#xff09; 常用选项&#xff1a; -a&#xff1a;列出目录下的所有文件&#xff0c;包括隐藏…

ubuntu在conda环境中使用 pip install -r requirements.txt但是没有安装在虚拟环境中

whereis pip pip listubuntu在conda环境中使用pip install lpips0.1.3 但是安装在了这里 Requirement already satisfied: lpips0.1.3 in /home/uriky/anaconda3/lib/python3.11/site-packages (0.1.3) 就会出现黄色波浪&#xff0c;未在虚拟环境中安装包 解决办法1&#xff1…

css笔记总结2

找到所有的 h1 标签。 选择器&#xff08;选对人&#xff09; 设置这些标签的样式&#xff0c;比如颜色为红色&#xff08;做对事&#xff09;。 ##css基础选择器 基础选择器又包括&#xff1a;标签选择器、类选择器、id 选择器和通配符选择器 ###标签选择器&#xff1a; 标签…

红黑树底层封装map、set C++

目录 一、框架思考 三个问题 问题1的解决 问题2的解决&#xff1a; 问题3的解决&#xff1a; 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename&#xff1a; 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…

安装ArcGIS失败,提示无效驱动器Error1327.Invalid Drive G错误

安装ArcGIS的时候&#xff0c;出现图中错误该怎么解决呢&#xff1f; Error 1327.Invalid Drive:G:\ 即错误代码&#xff1a;1327。无效驱动器G盘 出现以上问题的原因是 注册表中包含了该硬盘驱动器或网络驱动器的引用 但是在我的电脑中又没有该盘符 一般是已经卸载或者更换…

2024五月母亲节嘉年华活动方案

2024以花之名 致谢母亲簪花趣味亲子五月母亲节嘉年华活动方案-43P 活动策划信息&#xff1a; 方案页码&#xff1a;43页 文件格式&#xff1a;PPT 方案简介&#xff1a; 岁月温柔治愈 母爱闪闪发光 一年一度的PY圈孝子孝女大赛即将到来 本次母亲节&#xff0c;“以花之名…

Odin:免费轻量化BAS工具,守护企业网络安全新利器!

墨云科技依托多年安全验证经验积累&#xff0c;推出免费轻量化安全验证工具——Odin。墨云Odin安全验证工具从设计上极大的简化了BAS的任务流程&#xff0c;专为企业持续安全运营设计&#xff0c;提供轻量化、全方位的安全策略有效性验证。 Odin提供综合攻击模拟服务&#xff0…

电脑数据丢失如何恢复?简单数据恢复的办法分享!

在使用电脑的过程中&#xff0c;数据丢失问题几乎是每位用户都可能遭遇的困境。那么&#xff0c;当电脑数据丢失时&#xff0c;我们该如何恢复呢&#xff1f;下面小编就分享几种电脑数据丢失后的恢复方法&#xff0c;轻松找回丢失的数据。 一、回收站找回 电脑上数据丢失的常…