交换排序(冒泡排序和快速排序)

交换排序

冒泡排序

传统方法:

for (int i = 0; i < numsSize - 1; i++) {for (int j = 0; j < numsSize - 1 - i; j++) {if (nums[j] > nums[j + 1]) {Swap(&nums[j], &nums[j + 1]);}}
}

方法二:

while循环+for循环

int end = numsSize - 1;
while (end >= 0) {int flag = 0;for (int j = 0; j < end; j++) {if (nums[j] > nums[j + 1]) {Swap(&nums[j], &nums[j + 1]);flag = 1;}}if (flag == 0) break;--end;
}

快速排序

快排的核心是分治。

找到一个pivot.

左边比它小,有别比它大,一直递归,直到数组有序。

 找pivot有三种方法:

 

int PartSort1(int* nums, int left, int right) {int index = GetMidIndex(nums, left, right);Swap(&nums[left], &nums[right]);int begin = left, end = right;int pivot = begin;int key = nums[begin];while (begin < end) {//右边找小,放到左边while (begin < end && nums[end] >= key) {--end;}//小的放到左边的坑里,自己形成新的坑位nums[pivot] = nums[end];pivot = end;while (begin < end && nums[begin] <= key) {++begin;}nums[pivot] = nums[begin];pivot = begin;}pivot = begin;nums[pivot] = key;return pivot;
}

 end找小,begin找大,找到之后调用交换函数,最后begin和end重合,执行Swap(&nums[begin], &nums[keyi]);

int PartSort2(int* nums, int left, int right) {int index = GetMidIndex(nums, left, right);Swap(&nums[left], &nums[right]);int begin = left, end = right;int keyi = nums[begin];while (begin < end) {//找小while (begin < end && nums[end] >= nums[keyi]) {--end;}//找大while (begin < end && nums[begin] <= nums[keyi]) {++begin;}Swap(&nums[begin], &nums[end]);}Swap(&nums[begin], &nums[keyi]);return begin;}

 

 

int PartSort3(int* nums, int left, int right) {int index = GetMidIndex(nums, left, right);Swap(&nums[left], &nums[index]);int keyi = left;int prev = left, cur = left + 1;while (cur <= right) {if (nums[cur] < nums[keyi]) {++prev;Swap(&nums[prev], &nums[cur]);}++cur;}Swap(&nums[prev], &nums[keyi]);return prev;
}

快排存在一种最坏的情况,及一串数有序时,左别没有比pivot那个位置小的数。

需要一直找。

时间复杂度将变为O(n*n)

故需要通过三数取中来排除最坏的情况。

int GetMidIndex(int* nums, int left,int right) {int mid = (left + right) >> 1;if (nums[left] < nums[mid]) {if (nums[mid] < nums[right]) {return mid;}else if (nums[left] > nums[right]) {return left;}else {return right;}}else {//nums[left] > nums[mid]if (nums[mid] < nums[right]) {return right;}else if (nums[left] < nums[right]) {return left;}else {return mid;}}}
void QuickSort(int* nums, int left,int right) {if (left >= right) {return;}int keyIndex = PartSort3(nums, left, right);if (keyIndex - 1 - left > 10) {QuickSort(nums,left, keyIndex -1);}else {InsertSort(nums + left, keyIndex - 1 - left + 1);}if (right - (keyIndex + 1) > 10) {QuickSort(nums, keyIndex + 1, right);}else {InsertSort(nums + keyIndex + 1, right - (keyIndex + 1) + 1);}}

数据量小与10时使用InsertSort可以提高效率、

if{

}

else{

}

的目的是为了小区间优化。

进一步提高效率。

2^10=1024.

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

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

相关文章

C++,stl,常用排序算法,常用拷贝和替换算法

目录 1.常用排序算法 sort random_shuffle merge reverse 2.常用拷贝和替换算法 copy replace replace_if swap 1.常用排序算法 sort 默认从小到大排序 #include<bits/stdc.h> using namespace std;int main() {vector<int> v;v.push_back(1);v.push_ba…

使用C++,实现高精度加减乘除法运算!

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 我的专栏&#xff1a; \mathcal{{\color{Green} 我的专栏&#xff1a;} } 我的专栏&#xff1a; 《精选文章》《算法》《每日一道编程题》《高精度算法》 文章目录 前言高精度计算初始模版string 转…

Web APIs -05

js执行机制 js是单线程&#xff0c;同一个时间只能做一件事情&#xff0c;所有任务需要排队所以有时候会渲染不连贯 同步任务 都在主线程上执行&#xff0c;形成一个执行栈 异步任务 js的异步是通过回调函数实现的分为三类&#xff1a;1.普通事件&#xff1a;click等&…

秒懂百科,C++如此简单丨第二十天:贪心算法2

目录 Everyday English 前言 洛谷 P1031 均分纸牌 题目描述 思路点拨 AC代码 洛谷 P1094 纪念品分组 题目描述 样例输入 样例输出 思路点拨 AC代码 洛谷 P2660 zzc 种田 题目描述 思路点拨 AC Code 结尾 Everyday English Dont miss the opportunity. 机不可…

文件管理大师:深入解析Linux的文件与目录操控

目录 一、文件命名规则 1、可以使用哪些字符? 2、文件名的长度 3、Linux文件名大小写 4、Linux文件扩展名 二、文件管理命令 1、目录创建/删除 mkdir创建目录 直接创建文件夹 创建多个文件夹 递归创建写法 总结mkdir 删除空目录 2、文件创建、删除 touch创建文…

【图像分割 2024】ParaTransCNN

【图像分割 2024】ParaTransCNN 论文题目&#xff1a;ParaTransCNN: Parallelized TransCNN Encoder for Medical Image Segmentation 中文题目&#xff1a;用于医学图像分割的并行TransCNN编码器 论文链接&#xff1a;https://arxiv.org/abs/2401.15307 论文代码&#xff1a;H…

UI风格汇:毛玻璃风格风靡的原因解读

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;主要讲解各类UI风格特征、辨识方法、应用场景、运用方法等&#xff0c;本次带来的是毛玻璃风格的解读&#xff0c;有设计需求可以私聊。 一、什么是毛玻璃风格 毛玻璃风格&#xff08;Fros…

(08)Hive——Join连接、谓词下推

前言 Hive-3.1.2版本支持6种join语法。分别是&#xff1a;inner join&#xff08;内连接&#xff09;、left join&#xff08;左连接&#xff09;、right join&#xff08;右连接&#xff09;、full outer join&#xff08;全外连接&#xff09;、left semi join&#xff08;左…

鸿蒙系统优缺点,能否作为开发者选择

凡是都有对立面&#xff0c;就直接说说鸿蒙的优缺点吧。 鸿蒙的缺点&#xff1a; 鸿蒙是从2019年开始做出来的&#xff0c;那时候是套壳Android大家都知晓。从而导致大家不看鸿蒙系统&#xff0c;套壳Android就是多次一举。现在鸿蒙星河版已经是纯血鸿蒙&#xff0c;但是它的…

高性能MySQL 阅读笔记

mysql由服务器端与存储引擎两部分组成&#xff0c;存储引擎部分的锁机制对服务器端是透明的。服务器端内置缓存机制&#xff0c;有解析器和优化器机制。不同的存储引擎对事务、并发等都用不同的处理。 ACID代表的特性&#xff1a;原子性、一致性、隔离性、持久性 共享锁与排他…

【Web】CTFSHOW java刷题记录(全)

目录 web279 web280 web281 web282 web283 web284 web285 web286 web287 web288 ​web289 web290 web291 web292 web293 web294 web295 web296 web297 web298 web299 web300 web279 题目提示 url里告诉我们是S2-001 直接进行一个exp的搜 S2-001漏洞分析…

网络安全最典型基础靶场-DVWA-本地搭建与初始化

写在前面&#xff1a; 之前也打过这个 DVWA 靶场&#xff0c;但是是在虚拟机环境下的一个小块分区靶场&#xff1b; 本篇博客主要介绍在本地搭建 DVWA 靶场以及靶场的初始化&#xff0c;后续会陆续更新通关教程。 由于我们是在本地搭建&#xff0c;则需要基于你已经装好 phpstu…