排序算法-快速排序法(QuickSort)

 排序算法-快速排序法(QuickSort)

1、说明

快速排序法是由C.A.R.Hoare提出来的。快速排序法又称分割交换排序法,是目前公认的最佳排序法,也是使用分而治之(Divide and Conquer)的方式,会先在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分。其中小于中间值的数据放在左边,而大于中间值的数据放在右边,再以同样的方式分别处理左右两边的数据,直到排序完为止。操作与分割步骤如下:

假设有n项记录R_{1},R_{2},R_{3},...,R_{n},其键值为K_{1},K_{2},K_{3},...,K_{n}

  1. 先假设K的值为第一个键值。
  2. 从左向右找出键值K_{i},使得K_{i}> K
  3. 从左向右找出键值K_{j},使得K_{j}< K
  4. 如果i< j,那么K_{i}K_{j}互换,并回到步骤2。
  5. 如果i\geqslant j,那么将KK_{j}互相,并以j为基准点分割成左、右两部分,然后针对左、右两边执行步骤1~5,直到左边键值等于右边键值为止。

2、算法分析

  1. 在最好情况和平均情况下,时间复杂度为O(nlog_{2^{}}n)。在最坏情况下就是每次挑中的中间值不是最大就是最小的,其时间复杂度为O(n^{2})
  2. 快速排序法不是稳定排序法。
  3. 在最坏情况下,空间复杂度为O(n),而在最好情况下,空间复杂度为O(log_{2^{}}n)
  4. 快速排序法是平均运行时间最快的排序法。

3、C++代码 

#include<iostream>
using namespace std;void Print(int tempData[], int tempSize) {for (int i = 0; i < tempSize; i++) {cout << tempData[i] << "  ";}cout << endl;
}void Quick(int tempData[], int tempLeft, int tempRight) {int temp;int leftIndex;int rightIndex;int t;if (tempLeft < tempRight) {leftIndex = tempLeft + 1;rightIndex = tempRight;while (true) {for (int i = tempLeft + 1; i < tempRight; i++) {if (tempData[i] >= tempData[tempLeft]) {leftIndex = i;break;}leftIndex++;}for (int j = tempRight; j > tempLeft + 1; j--) {if (tempData[j] <= tempData[tempLeft]) {rightIndex = j;break;}rightIndex--;}if (leftIndex < rightIndex) {temp = tempData[leftIndex];tempData[leftIndex] = tempData[rightIndex];tempData[rightIndex] = temp;}else {break;}}if (leftIndex >= rightIndex) {temp = tempData[tempLeft];tempData[tempLeft] = tempData[rightIndex];tempData[rightIndex] = temp;Quick(tempData, tempLeft, rightIndex - 1);Quick(tempData, rightIndex + 1, tempRight);}}
}int main() {const int size = 10;int data[100] = { 32,5,24,55,40,81,17,48,25,71 };//32  5  24  55  40  81  17  48  25  71//32  5  24  25  40  81  17  48  55  71//32  5  24  25  17  81  40  48  55  71//17  5  24  25  32  81  40  48  55  71//5  17  24  25  32  81  40  48  55  71//5  17  25  24  32  81  40  48  55  71//5  17  25  24  32  71  40  48  55  81//5  17  25  24  32  55  40  48  71  81//5  17  25  24  32  48  40  55  71  81//5  17  25  24  32  40  48  55  71  81Print(data, size);Quick(data, 0, size - 1);Print(data, size);return 0;
}

输出结果 

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

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

相关文章

统计子岛屿的数量

统计子岛屿 题目描述 给你两个 m x n 的二进制矩阵 grid1 和 grid2 &#xff0c;它们只包含 0 &#xff08;表示水域&#xff09;和 1 &#xff08;表示陆地&#xff09;。一个 岛屿 是由 四个方向 &#xff08;水平或者竖直&#xff09;上相邻的 1 组成的区域。任何矩阵以外…

【C++】手撕STL系列——string篇

文章导读 本章我们将参照STL源码&#xff0c;来模拟实现string类&#xff0c;但不一定非要与库中完全相同。我们将其中重要的、常用的接口进行模拟实现&#xff0c;旨在加深string类的学习与记忆。 为了代码更好地复用&#xff0c;本篇模拟的函数接口的顺序大概为构造类——》…

京东商品价格监控API 高并发实时数据

随着电子商务的飞速发展&#xff0c;商品价格监控变得越来越重要。对于电商平台而言&#xff0c;实时监控商品价格不仅可以及时调整市场策略&#xff0c;还可以优化库存管理&#xff0c;提高销售额。本文以“京东商品价格监控API高并发实时数据”为标题&#xff0c;将探讨如何使…

序列化与反序列化And存入redis中的数据为什么要序列化

一、序列化与反序列化 序列化&#xff1a;指堆内存中的java对象数据&#xff0c;通过某种方式把对存储到磁盘文件中&#xff0c;或者传递给其他网络节点&#xff08;网络传输&#xff09;。这个过程称为序列化&#xff0c;通常是指将数据结构或对象转化成二进制的过程。 即将…

【STM32单片机】防盗报警器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用按键、动态数码管、蜂鸣器、指示灯、热释电人体红外传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;默认处于布防状态&#xff0c;D1指示灯…

Excel 规范录入数据

文章目录 录入日期录入百分比 快捷键&#xff1a; tab&#xff1a;向右切换单元格 enter&#xff1a;向下切换行 shift tab&#xff1a;向左切换单元格 shiftenter&#xff1a;向上切换行 录入日期 输入今天的日期的快捷键&#xff1a;Ctrl ; 输入当时的时间的快捷键&a…

Java反射获取抽象类方法属性问题讲解

Java反射获取抽象类方法属性问题讲解 结论一、案例准备二、测试方法&#xff1a;使用反射获取抽象类私有方法和私有属性具体操作&#xff08;获取私有方法&#xff09;具体操作&#xff08;获取私有属性&#xff09; 结论 Java 通过反射可以获得抽象类的任何修饰符&#xff08…

Gin框架中的Cookie怎么搞(会话控制)

参考地址 设置和获取 Cookie | Gin Web Framework (gin-gonic.com)https://gin-gonic.com/zh-cn/docs/examples/cookie/ 什么是cookie cookie在互联网上随处可见,具体体现如下: 保持登录状态 保存浏览器的历史记录 大数据随心配,按喜好推送讯息 购物网站加入购物车 都会…

flink中使用外部定时器实现定时刷新

背景&#xff1a; 我们经常会使用到比如数据库中的配置表信息&#xff0c;而我们不希望每次都去查询db&#xff0c;那么我们就想定时把db配置表的数据定时加载到flink的本地内存中&#xff0c;那么如何实现呢&#xff1f; 外部定时器定时加载实现 1.在open函数中进行定时器的…

【RealTek sdk-3.4.14b】RTL8197FH-VG+RTL8367+RTL8812F WiFi to LAN 和WiFi to WAN吞吐量

LAN <----------> 2.4G WiFi Throughput 天线频宽模式协议连接速率TX(Mbps)RX(Mbps)TX&RX(Mbps)2X240MHz802.11nTCP300Mbps2051922112X240MHz802.11nUDP300Mbps224234231 LAN <----------> 5G WiFi Throughput 天线频宽模式协议连接速率TX(Mbps)RX(Mbps)TX&…

IntelliJ IDEA Maven 项目的依赖分析

在一个 maven 的项目中&#xff0c;我们需要知道我们的项目中使用的包可能有哪些冲突。 这个在 IntelliJ IDEA 中提供了贴心的查看。 选择 Maven 项目中的分析依赖。 随后&#xff0c;IntelliJ IDEA 将会打开一个依赖分析的标签页。 在这个标签页中&#xff0c;我们可以看到…

用例图 UML从入门到放弃系列之三

1.说明 关于用例图&#xff0c;这篇文章我将直接照搬罗伯特.C.马丁老爷子在《敏捷开发》一书种的第17章&#xff0c;并配上自己的理解&#xff0c;因为这一章写的实在是太精彩了&#xff0c;希望能够分享给大家&#xff0c;共勉。以下是老爷子的原文中文翻译以及豆芽的个人解读…

Ultra-Fast-Lane-Detection 车道线学习资料整理

目录 官方版本 两个优化 数据标注,降低参数量 1 数据标注 2降低参数量

代码随想录算法训练营Day50|动态规划9

代码随想录算法训练营Day50|动态规划9 文章目录 代码随想录算法训练营Day50|动态规划9一、198.打家劫舍二、213.打家劫舍II三、337.打家劫舍 III 一、198.打家劫舍 class Solution {public int rob(int[] nums) {if (nums null || nums.length 0) return 0;if (nums.length …

C++程序员入门怎么学?

1 背景 经常听到不少朋友在吐槽C太难学了&#xff0c;说什么从入门到放弃等等&#xff1b;做为一名C老兵&#xff0c;从2003年开始入坑C到今年2023年&#xff0c;整整20年的C开发从业者的我&#xff0c;今天尝试给有兴趣从事C开发的程序员提些建议&#xff0c;希望可以帮到大家…

C++ (Chapter 1)

C (一) 1.C的命名空间 先来看一个C语言的例子: 下面这段代码是可以正常运行的. #include<stdio.h> int rand 0; int main() {printf("%d \n", rand);return 0; }但是,包含了一个头文件之后,甚至无法通过编译. #include<stdio.h> #include<stdli…

力扣每日一题35:搜索插入的位置

题目描述&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5…

大数据Doris(八):启动FE步骤

文章目录 启动FE步骤 一、配置环境变量 二、​​​​​​​创建doris-mate

排序算法-插入排序法(InsertSort)

排序算法-插入排序法&#xff08;InsertSort&#xff09; 1、说明 插入排序法是将数组中的元素逐一与已排序好的数据进行比较&#xff0c;先将前两个元素排序好&#xff0c;再将第三个元素插入适当的位置&#xff0c;也就是说这三个元素仍然是已排序好的&#xff0c;接着将第…

剖析伦敦银最新价格走势图

国际金融市场瞬息万变&#xff0c;伦敦银的价格走势会受到诸多因素的影响&#xff0c;比如重要经济数据的公布&#xff0c;国际间的政治博弈&#xff0c;突发的政经大事&#xff0c;都可以令白银价格的走势&#xff0c;在短时间内暴涨暴跌的情况。 要在伦敦银市场实现良好的收益…