C++ 快速排序算法

快速排序算法最坏的时间复杂度时o(n*n),期望的运行时间为o(nlgn)。

逻辑分析:

1 先从数组中选取一个数作为基数,可随机选择;

2 将数组中大于该基数的放在该基数右边,小于该基数的放在该基数左边;

3对左右两个数组重复第二步。

代码分析

数组a[]={2,1,4,5,3,8,7,9,0,6},该数组第一次分区时,left=0,right=10,假设随机基数为a[4]=3。

首先将a[0]和a[4]互换位置,数组a[]={3,1,4,5,2,8,7,9,6,0}。

进行第一次分区:

                  i=0,j=0时,j=left,数组没有改变没有改变。

                  i=0,j=1时,a[j]=1<a[left]=3,故交换a[++i]和a[j]的位置,++i=1,故此时数组依然没有变化。

                  i=1,j=2时,a[j]=4>a[left]=3,此时数组仍然没有变化。

                  i=1,j=3时,a[j]=5>a[left]=3,此时数组仍然没有变化。

                  i=1,j=4时,a[j]=2<a[left]=3,故交换a[++i]和a[j]的位置,++i=2,数组a[]={3,1,2,5,4,8,7,9,6,0}。

                  i=2,j=5时,a[j]=8>a[left]=3,此时数组仍然没有变化。

                  i=2,j=6时,a[j]=7>a[left]=3,此时数组仍然没有变化。

                  i=2,j=7时,a[j]=9>a[left]=3,此时数组仍然没有变化。

                  i=2,j=8时,a[j]=6>a[left]=3,此时数组仍然没有变化。

                  i=2,j=9时,a[j]=0<a[left]=3,故故交换a[++i]和a[j]的位置,++i=3,数组a[]={3,1,2,0,4,8,7,9,6,5}。

                  i=3,跳出循环,交换a[i]和a[left]的位置,数组a[]={0,1,2,3,4,8,7,9,6,5。

#include<iostream>
#include<cstdlib>using namespace std;//交换a,b的值,注意如果漏掉&,结果不正确
void swap(int &a, int &b)
{int temp = a;a = b;b = temp;
}//分区  若a[j]<基数,则将a[j]的值和a[++i]交换
int partition(int a[], int left, int right)
{int i = left;for (int j = left; j < right; j++){if (a[j] < a[left]){swap(a[++i], a[j]);}}swap(a[i], a[left]);return i;
}//快速排序  用随机法选取任意一个数(数组内)作为基数,并将该数与a[left]互换
//递归方式,对分区数组再进行划分
void quickSort(int a[], int left, int right)
{if (left < right){int i = left + rand() % (right - left);swap(a[i], a[left]);int mid = partition(a, left, right);quickSort(a, left, mid);quickSort(a, mid + 1, right);}}int main()
{int a[] = { 2,1,4,5,3,8,7,9,0,6 };quickSort(a, 0, 10);for (int i = 0; i < 10; i++){cout << a[i] << "";}cout << endl;system("pause");return 0;}

 

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

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

相关文章

.NET Core on K8S 学习与实践系列文章索引 (更新至20191116)

更新记录&#xff1a;-- 2019-11-16 增加Docker容器监控系列文章// 此外&#xff0c;今天是11月17日&#xff0c;我又老了一岁&#xff0c;祝我自己生日快乐&#xff01;近期在学习Kubernetes&#xff0c;基于之前做笔记的习惯&#xff0c;已经写了一部分文章&#xff0c;因此给…

C++插入排序算法

插入排序的时间复杂度为o(n*n)。 逻辑分析&#xff1a; 将数组第一个元素认为是有序数组&#xff0c;然后比较第二个元素的关键字与第一个元素关键字的大小&#xff0c;有序排列。 将数组后面一个元素的关键字插入到前面的有序数组中&#xff0c;一直重复至排序完成。 代码…

身边的设计模式(一):单例 与 RedisCacheManager

大家好&#xff0c;以后我会用23篇文章&#xff0c;来给大家讲解设计模式&#xff0c;当然如果你看过我的项目&#xff0c;很多设计模式已经很会了&#xff0c;只是没有注意到&#xff0c;我这里会讲解一下&#xff0c;大家就会发现&#xff0c;如果你看懂了我的项目&#xff0…

插入排序 希尔排序 C++

最优时间复杂度为o(n)&#xff0c;又称缩小增量排序。 逻辑分析&#xff1a; 1、希尔排序首先是确定增量&#xff0c;默认的希尔增量&#xff08;不一定是最优&#xff09;为length/2。 2、根据增量分组&#xff0c;将分组的元素利用直接插入法排序。 3、增量增量/2&#x…

Kubernetes包管理器Helm发布3.0版本

Helm 3.0 已经发布&#xff0c;该版本是 CLI 工具的最新主要版本&#xff0c;主要关注简单性、安全性和可用性&#xff0c;内容如下&#xff1a;新特性移除 Tiller&#xff08;Helm 2 是一种 Client-Server 结构&#xff0c;客户端称为 Helm&#xff0c;服务器称为 Ti…

冒泡排序法 C++

实在是想感叹一下&#xff0c;因为一个很简单的东西&#xff0c;自己在网上找了半天反而弄的很复杂&#xff0c;逻辑性太强&#xff0c;小白实在是看不懂。因此&#xff0c;下面是一个最小白的冒泡排序的实现方式。 时间复杂度o(n*n)。 逻辑分析&#xff1a; 依次比较数组中…

“兼职”运维的常用命令

自从产品转到了 dotNET Core 之后&#xff0c;更深入的接触 Linux和 Docker &#xff0c;而我每天的工作中&#xff0c;有一部分时间相当于在“兼职”做一些运维的事情。下面是一些在日常中常用的命令&#xff0c;算是个备忘吧。环境操作系统&#xff1a;CentOS7Docker&#xf…

选择排序 C++

选择排序的时间复杂度为o(n*n)&#xff0c;空间复杂度为o(n)。 逻辑分析&#xff1a; 1 假设数组中的最小数为a[0]&#xff0c;然后比较数组中其他数与a[0]的大小&#xff0c;若a[i]<a[0]&#xff0c;则交换两者为止&#xff0c;如此循环下来&#xff0c;最小的数字就存在…

rabbitmq死信队列详解与使用

先从概念解释上搞清楚这个定义&#xff0c;死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;字面意思可以这样理解&#xff0c;一般来说&#xff0c;producer将消息投递到broker或者直接到queue里了&#xff0c;consumer从queue取出消息进行消费&#xff0c;但某些时…

归并排序算法 C++

感谢博客https://blog.csdn.net/a130737/article/details/38228369 归并排序的时间复杂度为o(nlgn)&#xff0c;空间复杂度为o(n)。是一种采用分治思想的排序方法。 逻辑分析&#xff1a; 假设输入数组a[] { 2, 1, 4, 5, 3, 8, 7, 9, 0, 6 }。 首先将数组二分成两个数组le…

使用ASP.NET Core 3.x 构建 RESTful API - 3.2 开始建立Controller和Action

Demo下面我们就来实践一下。打开之前的项目&#xff0c;并建立CompaniesController&#xff1a; 这里有6个地方比较关键&#xff0c;我们挨个看一下&#xff1a; RESTful API 或者其它Web API的Controller都应该继承于 ControllerBase 这个类&#xff08;点此查看详细的官方文档…

C++ 链表

线性表&#xff08;顺序表&#xff09;有两种存储方式&#xff1a;链式存储和顺式存储&#xff0c;顺式存储如数组&#xff0c;其内存连续分配&#xff0c;且是静态分配。链式存储&#xff0c;内存是不连续的&#xff0c;且是动态分配。前一个元素存储数据&#xff0c;后一个元…

波拉契尔数列 C++

题目&#xff1a;写一个函数&#xff0c;输入n, 求斐波那契数列的第n项。 分析&#xff1a;该题有两种实现方式递归或循环。当n比较大的时候f(n)结果也会比较大&#xff0c;故定义的时候可以采用long(int 也行)。递归会有大量的重复计算&#xff0c;而循环可以把f(n-1)和f(n-2)…

Deepin 下 使用 Rider 开发 .NET Core

国产的 Deepin 不错&#xff0c;安利一下。Deepin 用了也有一两年&#xff0c;也只是玩玩&#xff0c;没用在开发上面。后来 Win10 不太清真了&#xff0c;就想着能不能到 Deepin下撸码。要搞开发&#xff0c;首先少不了 IDE&#xff0c;VS2019 用不来&#xff0c;Vs Code 太复…

求旋转数组的最小数字C++

发现还是数组这种最简单的编码才适合我&#xff0c;遇到树&#xff0c;链表这些真的是一头雾水&#xff0c;自己也不知道怎么实现。言归正传&#xff0c;该篇文章介绍如何求旋转数组的最小值&#xff0c;求最大值可以适当改编即可。 什么是旋转数组呢&#xff0c;就是将一个数…

[视频演示].NET Core开发的iNeuOS物联网平台,实现从设备PLC、云平台、移动APP数据链路闭环...

此次我们团队人员对iNeuOS进行了全面升级&#xff0c;主要升级内容包括&#xff1a;&#xff08;1&#xff09; 设备容器增加设备驱动&#xff0c;包括&#xff1a;西门子&#xff08;S7-200smart、S7-300、S7-400、S7-1200、S7-1500&#xff09;、三菱&#xff08;FxSerial…

707 设计单链表

第一次完成这样的设计&#xff0c;一路磕磕碰碰&#xff0c;遇到了许多问题&#xff0c;最后终于一一解决了。感恩https://blog.csdn.net/lym940928/article/details/81276658 题目如下&#xff1a; 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两…

选择开源项目什么最重要?

开发人员在决定是否使用某个开源项目时考虑到的最重要事项是什么&#xff1f;代码质量&#xff1f;安全性&#xff1f;好的文档&#xff1f;上述因素都很重要&#xff0c;但根据 Tidelift 和 The New Stack 的联合调查&#xff0c;控制着开源项目的开源许可证才是最需要考量的因…

leetcode 二进制求和 addBinary

题目描述&#xff1a; 给定两个二进制字符串&#xff0c;返回他们的和&#xff08;用二进制表示&#xff09;。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a "11", b "1" 输出: "100" 示例 2: 输入: a "1010", b…