排序嘉年华———选择排序和快排原始版

文章目录

  • 一.选择排序
  • 二.霍尔版快速排序
    • 1.单趟思想
    • 2.递归多趟
    • 3.寻找中间值作为key

一.选择排序

在进行大佬“快排”之前先来一道开胃小菜————选择排序
选择排序是一种简单直观的排序算法,它的基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

选择排序的具体步骤如下:1.在未排序序列中找到最小(或最大)的元素,存放到排序序列的起始位置。
2.从剩余未排序元素中继续寻找最小(或最大)的元素,放到已排序序列的末尾。
3.重复步骤2,直到所有元素均排序完毕。

在这里插入图片描述
两端同时选择进行排序整理。

void Selectsort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin + 1; i <= end; i++){if (a[i] < a[mini]){mini = begin;}if (a[i] > a[maxi]){maxi = begin;}}Swap(&a[begin], &a[mini]);if (maxi == begin){maxi = mini;}Swap(&a[end], &a[maxi]);begin++;end--;}
}

每次有两个数被整理到队首和队尾,但由于先更新的是最小值mini所以,如果begin刚好是最大值的话,在进行

Swap(&a[begin], &a[mini]);

时,把最大值下标与最小值下标交换了,因此我们需要加一步判断

if (maxi == begin){maxi = mini;}

在这里插入图片描述

二.霍尔版快速排序

在这里插入图片描述
霍尔版快速排序的基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的数据小,然后再按此方法对这两部分数据分别进行快速排序,递归地进行下去,直到整个序列有序。

霍尔版快速排序的具体步骤如下:1.选择一个基准元素,通常是序列中的第一个元素。
2.设置两个指针,一个指向序列的起始位置,另一个指向序列的末尾。
3.移动指针,使得左指针指向大于等于基准元素的值,右指针指向小于等于基准元素的值,然后交换两个指针所指向的元素。
4.重复步骤3,直到两个指针相遇。
5.将基准元素与相遇位置的元素交换。
6.递归地对基准元素左右两部分进行快速排序。

1.单趟思想

int left = begin, right = end;int keyi = begin;while (left < right){//右边找小while (left < right && a[right] >= a[keyi]){right--;}//左边找大while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[left], &a[keyi]);

在这里插入图片描述
由于从右边开始找大,所以结束时左右相遇点一定小于等于key,则最后要将left与keyi交换

2.递归多趟

将keyi更新为相遇点即left/right递归keyi的左边和右边keyi这个位置算已经排好

keyi = left;//更新相遇点为keyi//递归Quiksort(a, begin, keyi - 1);Quiksort(a, keyi + 1, end);

结束条件为左边或右边只有一个数或没有值

//递归条件if (begin > end)return;

在这里插入图片描述
通过多次递归,左边的每一个值都带上了五角星符号,意味着排序成功

3.寻找中间值作为key

如果在排序有序,或者数据太过极端时,盲目使用left作为keyi,会降低排序效率,这时候就需要在找keyi时进行筛选。
在这里插入图片描述
如图这样就无法发挥好快排的双线优势

所以此时我们需要找到中间值进行交换
int GetMidi(int* a, int begin, int end)
{int midi = (begin + end) / 2;// begin end midi三个数选中位数if (a[begin] < a[midi]){if (a[midi] < a[end])return midi;else if (a[begin] > a[end])return begin;elsereturn end;}else//a[begin]>=a[midi]{if (a[midi] > a[end])return midi;else if (a[begin] < a[end])return begin;else return end;}
}
int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);

选取10万个数据随机数进行效率检测

void TestOP()
{srand(time(0));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);int* a3 = (int*)malloc(sizeof(int) * N);int* a4 = (int*)malloc(sizeof(int) * N);int* a5 = (int*)malloc(sizeof(int) * N);for (int i = 0; i < N; i++){a1[i] = rand();a2[i] = rand();a3[i] = rand();a4[i] = rand();a5[i] = rand();}int begin1 = clock();Insertsort(a1, N);int end1 = clock();int begin2 = clock();Bubblesort(a2, N);int end2 = clock();int begin3 = clock();Shellsort(a3, N);int end3 = clock();int begin4 = clock();Quiksort(a4, 0,N-1);int end4 = clock();int begin5 = clock();Heapsort(a5, N);int end5 = clock();printf("Insertsort:%d\n", end1 - begin1);printf("Bubblesort:%d\n", end2 - begin2);printf("Shellsort:%d\n", end3 - begin3);printf("Qucksort:%d\n", end4 - begin4);printf("Heapsort:%d\n", end5 - begin5);free(a1);free(a2);free(a3);free(a4);free(a5);}

在这里插入图片描述
如图所示,希尔排序,堆排序和快速排序是一个量级,冒泡排序略慢
不了解堆排序和希尔排序请关注往期作品:
链接1: 希尔排序
连接2:堆排序
完整代码如下:

void Quiksort(int* a, int begin,int end)
{//递归条件if (begin > end)return;int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int left = begin, right = end;int keyi = begin;while (left < right){//右边找小while (left < right && a[right] >= a[keyi]){right--;}//左边找大while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[left], &a[keyi]);keyi = left;//更新相遇点为keyi//递归Quiksort(a, begin, keyi - 1);Quiksort(a, keyi + 1, end);
}

在这里插入图片描述

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

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

相关文章

XZ_iOS 之 M1 M2 M3的M系列芯片的Mac苹果电脑安装cocoapods

安装的前提&#xff0c;应用程序->终端->右键-显示简介->勾选 使用Rosetta打开&#xff0c;如下图&#xff0c;然后重启终端 安装的顺序如下&#xff1a;Homebrew->rvm->ruby->cocoapods 1、安装Homebrew /bin/bash -c "$(curl -fsSL https://raw.git…

Python Pandas Excel/csv文件的保存与读取(第14讲)

Python Pandas Excel/csv文件的读取于保存(第14讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

部署promethues采集kubelet数据报错:server returned HTTP status 403 Forbidden

背景 笔者尝试部署手动部署promethues去采集kubelet的node节点数据信息时报错 笔者的promethus的配置文件和promthues的clusterrole配置如下所示&#xff1a; apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:name: prometheus rules: - apiGroups: […

一种基于外观-运动语义表示一致性的视频异常检测框架 论文阅读

A VIDEO ANOMALY DETECTION FRAMEWORK BASED ON APPEARANCE-MOTION SEMANTICS REPRESENTATION CONSISTENCY 论文阅读 ABSTRACT1. INTRODUCTION2. PROPOSED METHOD3. EXPERIMENTAL RESULTS4. CONCLUSION阅读总结&#xff1a; 论文标题&#xff1a;A VIDEO ANOMALY DETECTION FRA…

ASP.NET Core MVC依赖注入理解(极简个人版)

依赖注入 文献来源&#xff1a;《Pro ASP.NET Core MVC》 Adam Freeman 第18章 依赖注入 1 依赖注入原理 所有可能变化的地方都用接口在使用接口的地方用什么实体类通过在ConfigureService中注册解决注册的实体类需要指定在何种生命周期中有效 TransientScopedSingleton 2…

【一】FPGA实现SPI协议之SPI协议介绍

【一】FPGA实现SPI协议之SPI协议介绍 一、spi协议解析 spi协议有4根线&#xff0c;主机输出从机输入MOSI、主机输入从机输出MISO、时钟信号SCLK、片选信号SS\CS 。 一般用于主机和从机之间通信。由主机发起读请求和写请求&#xff0c;主机的权限是主动的&#xff0c;从机是被…

深入理解 HTTP 和 HTTPS:提升你的网站安全性(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

《点云处理》 点云去噪

前言 通常从传感器&#xff08;3D相机、雷达&#xff09;中获取到的点云存在噪点&#xff08;杂点、离群点、孤岛点等各种叫法&#xff09;。噪点产生的原因有不同&#xff0c;可能是扫描到了不想要扫描的物体&#xff0c;可能是待测工件表面反光形成的&#xff0c;也可能是相…

【AI图集】猫狗的自动化合成图集

猫是一种哺乳动物&#xff0c;通常被人们作为宠物饲养。它们有柔软的毛发&#xff0c;灵活的身体和尖锐的爪子。猫是肉食性动物&#xff0c;主要以肉类为食&#xff0c;但也可以吃一些蔬菜和水果。猫通常在夜间活动&#xff0c;因此它们需要足够的玩具和活动空间来保持健康和快…

CentOS:Docker 创建及镜像删除

1、安装docker 远程连接服务器&#xff0c;可以直接下载netsarang比较好用 家庭/学校免费 - NetSarang Website 如果有残留docker未删除干净&#xff0c;请使用 sudo yum -y remove docker docker-common docker-selinux docker-engine Step1&#xff1a;安装必要的一些…

银河麒麟v10 安装mysql 8.35

银河麒麟v10 安装mysql 8.35 1、下载Mysql安装包2、安装Mysql 8.352.1、安装依赖包2.2、安装Mysql2.3、安装后配置 1、下载Mysql安装包 访问官网下载链接 链接: https://dev.mysql.com/downloads/mysql/ 选择如下 点击下载按钮 下载安装包 2、安装Mysql 8.35 官方安装文档…

substring从字符串中提取字符串【前闭后开)

截取指定大小的字符串subString包含两种重载方式&#xff1a; substring(int beginIndex):从指定的 beginIndex(包括)开始&#xff0c;提取字符串&#xff0c;直到字符串尾&#xff1b;substring(int beginIndex,int endIndex): 从指定的beginIndex&#xff08;包括&#xff0…