当前位置: 首页 > news >正文

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)

目录

前言

已完成内容

快速排序实现

01-开发环境

02-文件布局

03-代码

01-主函数

02-头文件

03-PSeqListFunction.cpp

04-SortCommon.cpp

05-SortFunction.cpp

结语


前言

        此专栏包含408考研数据结构全部内容,除其中使用到C++引用外,全为C语言代码。使用C++引用主要是为了简化指针的使用,避免二重指针的出现。

        快速排序本文主要采用了两种编写思想:1)交换思想 2)覆盖思想(挖坑法)。其中交换思想中又包含两种:1)直接对数组指针进行操作,移动指针所在位置,实现分治。2)对数组下表进行操作、记录,实现分治。

        两种思想各有特色,读者可根据自身情况选择,相对而言挖坑法更易理解。

        交换思想两种操作方式宜各有特色,个人觉得指针方式更易理解。(最初书写代码时,便是采用了交换思想--指针操作方式。)每个人情况不同,可根据自身情况选择。

已完成内容

[数据结构]:01-顺序表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:02-单链表(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:03-栈(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:04-循环队列(数组)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:05-循环队列(链表)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:06-队列(链表带头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:07-二叉树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:08-顺序查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:09-二分查找(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:10-二叉排序树(无头结点)(C语言实现)_Chandni.的博客-CSDN博客

[数据结构]:11-冒泡排序(顺序表指针实现形式)(C语言实现)_Chandni.的博客-CSDN博客 

快速排序实现

01-开发环境

        语言:C/C++14

        编译器:MinGW64

        集成开发环境:CLion2022.1.3

02-文件布局

        请在CLion集成开发环境中创建C++可执行程序,否则无法运行,原因上面已解释。

                        ​​   

03-代码

01-主函数

        用于测试快速排序。

// 顺序表以指针形式实现(申请堆空间,可动态控制顺序表大小)--数组实现形式不可以动态控制顺序表大小
#include "./Head/PSeqSearchData.h"
#include "./Source/PSeqListFunction.cpp"
#include "./Source/SortCommon.cpp"
#include "./Source/SortFunction.cpp"int main() {// 顺序表初始化PSeqList PSL;PSeqListCreate(PSL, 10);PSeqListPrint(PSL);// 调试内容
//    int Array[] = {2, 3, 1, 5, 1, 10};memcpy(PSL.data, Array, sizeof(Array));
//    PSL.data = Array;
//    PSL.ListLength = 6;// 快速排序--数组指针操作
//    QuickSortPointer(PSL.data, PSL.ListLength);
//    PSeqListPrint(PSL);// 快速排序--数组操作// 初始化头标签和尾标签
//    int start = 1, end = PSL.ListLength - 1;
//    QuickSort(PSL.data, start, end);
//    PSeqListPrint(PSL);// 快速排序--挖坑法QuickSortHole(PSL.data, 0, PSL.ListLength - 1);PSeqListPrint(PSL);return 0;
}

02-头文件

        用于存储结构体和常量等。

//
// Created by 24955 on 2023-03-02.
// 顺序表以指针形式实现(申请堆空间,可动态控制顺序表大小)-数组实现形式不可以动态控制顺序表大小
//#ifndef INC_01_SEQUENCESEARCH_PSEQSEARCHDATA_H
#define INC_01_SEQUENCESEARCH_PSEQSEARCHDATA_H
// 头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>// 常量
typedef int ElemType;// 结构体
// 顺序表结构体(以指针形式实现)
typedef struct {ElemType *data;int ListLength;
}PSeqList;
#endif //INC_01_SEQUENCESEARCH_PSEQSEARCHDATA_H

03-PSeqListFunction.cpp

        用于存储顺序表初始化和打印输出等函数。

//
// Created by 24955 on 2023-03-02.
// 顺序表以指针形式实现(申请堆空间,可动态控制顺序表大小)--数组实现形式不可以动态控制顺序表大小
// 不使用哨兵
//
// 顺序表初始化
void PSeqListCreate(PSeqList &PSList, int Length) {/** 1. 为顺序表申请堆空间* 2. 根据Length大小设置顺序表长度* 3. 随机数初始化顺序表*/PSList.ListLength = Length;PSList.data = (ElemType *) malloc((PSList.ListLength) * sizeof(ElemType));srand(time(NULL));for (int i = 0; i < PSList.ListLength; i++) {PSList.data[i] = rand() % 100;}
}// 顺序表打印输出
void PSeqListPrint(PSeqList PSList) {/** 1. 0号元素为哨兵因此从1号元素开始打印输出*/for (int i = 0; i < PSList.ListLength; i++) {printf("%3d", PSList.data[i]);}printf("\n");
}

04-SortCommon.cpp

        用于存储排序公用函数--交换函数、分割函数。

//
// Created by 24955 on 2023-03-06.
//
// 交换两值元素
void Swap(ElemType &ElemOne, ElemType &ElemTwo) {/** 1. 交换两元素值*/ElemType TemporaryData;TemporaryData = ElemOne;ElemOne = ElemTwo;ElemTwo = TemporaryData;
}// 分割函数--交换
int Partition(ElemType *Data, int start, int end) {/** 1. PartitionIndex标记分割元素所在位置* 2. PartitionData标记分割元素值* 3. 主要思想为交换*/// 开始标签指向分割元素前一个位置,因此需要-1// 可根据自身情况修改(为满足两函数都可调用,做了一定折中处理)// QuickSortPointer函数中可根据自身理解设置start值ElemType PartitionIndex = start - 1;ElemType PartitionData = Data[PartitionIndex];// 当end > start时,完成一次分割(大于分隔值的在右边,小于分隔值的在左边)while (start <= end) {// 设当前数组第0个元素为分割元素/* 1. 头标签代表元素值大于等于分隔值时* 2. 判断尾标签代表元素与分隔值大小关系*/if (Data[start] >= PartitionData) {if (Data[end] >= PartitionData) {// 尾标签代表元素值大于等于分隔值时,移动尾标签-1end--;} else {// 尾标签代表元素值小于分隔值时,交换并将头标签+1,尾标签-1Swap(Data[start++], Data[end--]);}} else {// 头标签代表元素值小于分隔值时,移动头标签+1start++;}}// 将分割元素与尾标签所指元素交换,即可将分割元素位于"中间位置"(排好分割元素)Swap(Data[end], Data[PartitionIndex]);// 返回交换后分割元素所在位置return end;
}// 分割函数--挖坑法(覆盖)
int PartitionHole(ElemType *Data, int start, int end) {/** 1. 挖坑法主要思想为覆盖*/// 用一个变量记录分割元素值ElemType PartitionData = Data[start];while (start < end) {// 从后向前寻找第一个小于分割元素值的位置while (start < end && Data[end] >= PartitionData) {end--;}// 覆盖Data[start] = Data[end];// 从前向后寻找第一个大于分割元素值的位置while (start < end && Data[start] <= PartitionData) {start++;}// 覆盖Data[end] = Data[start];}// start所在位置几位中间位置(排序后实际所在位置)Data[start] = PartitionData;return start;
}

05-SortFunction.cpp

        用于存储快速排序函数。

//
// Created by 24955 on 2023-03-06.
// 快排最好、平均时间复杂度O(nlog2n),最坏时间复杂度O(n^2)(本身有序)
// 快排空间复杂度O(log2n)
//
// 快速排序--数组指针操作
void QuickSortPointer(ElemType *Data, int Length) {/** 1. 传递数组指针和长度进行递归排序* 2. 此方式不便于理解当方便使用*/// 初始化头标签和尾标签int start = 1, end = Length - 1;// 备份Data数组--用于结尾交换和参数传递使用(内部更改了Data数组值)ElemType *TemporaryData = Data;// 数组为1个或0个元素时,自身有序因此结束递归if (Length > 1) {end = Partition(Data, start, end);// 可用以下代码替换该处函数调用{
//        // 当end > start时,完成一次分割(大于分隔值的在右边,小于分隔值的在左边)
//        while (start <= end) {
//            // 设当前数组第0个元素为分割元素
//            /* 1. 头标签代表元素值大于等于分隔值时
//             * 2. 判断尾标签代表元素与分隔值大小关系*/
//            if (Data[start] >= Data[0]) {
//                if (Data[end] >= Data[0]) {
//                    // 尾标签代表元素值大于等于分隔值时,移动尾标签-1
//                    end--;
//                } else {
//                    // 尾标签代表元素值小于分隔值时,交换并将头标签+1,尾标签-1
//                    Swap(Data[start++], Data[end--]);
//                }
//            } else {
//                // 头标签代表元素值小于分隔值时,移动头标签+1
//                start++;
//            }
//        }
//        // 将分割元素与尾标签所指元素交换,即可将分割元素位于"中间位置"(排好分割元素)
//        Swap(Data[end], Data[0]);}// 分而治之,分别将分割元素之前的元素和之后的元素重新进行快排// 直到只有一个元素时,结束递归QuickSortPointer(TemporaryData, end);QuickSortPointer(TemporaryData + end + 1, Length - end - 1);}
}// 快速排序--数组操作
void QuickSort(ElemType *Data, int start, int end) {/** 1. 递归结束条件为start > end*/if (start <= end) {int PartitionIndex = Partition(Data, start, end);// 设置尾标签为PartitionIndex - 1QuickSort(Data, start, PartitionIndex - 1);// 头标签位于分割元素之前,因此需要+2指向新的头标签(+1指向分割元素)QuickSort(Data, PartitionIndex + 2, end);}
}// 快速排序--挖坑法
void QuickSortHole(ElemType *Data, int start, int end) {/** 1. 递归结束条件为start >= end*/if (start < end) {int PartitionIndex = PartitionHole(Data, start, end);QuickSortHole(Data, start, PartitionIndex - 1);QuickSortHole(Data, PartitionIndex + 1, end);}
}

结语

        此博客主要用于408考研数据结构C语言实现记录,内有不足,可留言,可讨论。

相关文章:

[数据结构]:12-快速排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 快速排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…...

运算符——“Python”

各位CSDN的uu们你们好呀&#xff0c;好久没有更新Python文章了&#xff0c;今天&#xff0c;小雅兰的内容就是Python中的操作符啦&#xff0c;那么现在&#xff0c;就让我们进入Python的世界吧 注释 注释是什么 注释的语法 注释的规范 输入输出 和用户交互 通过控制台输出 通…...

2022 IoTDB Summit:华为王超《Apache IoTDB 在华为云的实践》

12 月 3 日、4日&#xff0c;2022 Apache IoTDB 物联网生态大会在线上圆满落幕。大会上发布 Apache IoTDB 的分布式 1.0 版本&#xff0c;并分享 Apache IoTDB 实现的数据管理技术与物联网场景实践案例&#xff0c;深入探讨了 Apache IoTDB 与物联网企业如何共建活跃生态&#…...

C 语言网络编程 — PF_NETLINK sockets

目录 文章目录目录PF_NETLINK socketsPF_NETLINK sockets Linux 提供了 4 种 User Process 和 Kernel 之间进行通信的 IPC&#xff08;Inter-Process Communicate&#xff0c;进程间通信&#xff09;方式&#xff1a; /procioctlsysfsPF_NETLINK sockets&#xff08;Netlink …...

广州银行冲刺A股上市:不良贷款规模突破100亿元,不良率飙升

又一家城商行平移申报IPO。近日&#xff0c;广州银行股份有限公司&#xff08;下称“广州银行”&#xff09;递交招股书&#xff0c;准备在深圳证券交易所主板上市。本次冲刺上市&#xff0c;广州银行计划募资约94.79亿元&#xff0c;国泰君安证券为其保荐机构。 截至目前&…...

【C++】bsearch函数的使用及二分法查找介绍

写程序的时候&#xff0c;肯定避免不了需要从集合中找到符合条件的元素&#xff0c;一般情况下&#xff0c;最简单也最常用的就是循环遍历元素&#xff0c;这种方法虽然写的简单&#xff0c;但是小数据量还行&#xff0c;但是数据过大的话&#xff0c;这样效率就低了。循环的时…...

分布式系统中的补偿机制设计问题

我们知道&#xff0c;应用系统在分布式的情况下&#xff0c;在通信时会有着一个显著的问题&#xff0c;即一个业务流程往往需要组合一组服务&#xff0c;且单单一次通信可能会经过 DNS 服务&#xff0c;网卡、交换机、路由器、负载均衡等设备&#xff0c;而这些服务于设备都不一…...

类成员的方法

初识对象 生活中或是程序中&#xff0c;我们都可以使用设计表格、生产表格、填写表格的形式组织数据进行对比&#xff0c;在程序中&#xff1a; 设计表格&#xff0c;称之为&#xff1a;设计类&#xff08;class&#xff09; 打印表格&#xff0c;称之为&#xff1a;创建对象 …...

华为OD机试真题Python实现【端口合并】真题+解题思路+代码(20222023)

端口合并 题目 有M(1<=M<=10)个端口组, 每个端口组是长度为N(1<=N<=100)的整数数组, 如果端口组间存在 2 个及以上不同端口相同, 则认为这 2 个端口组互相关联,可以合并 第一行输入端口组个数 M,再输入 M 行,每行逗号分隔,代表端口组。 输出合并后的端口组…...

自考本科计算机网络原理(04741)历年大题真题【18年10月-22年10月】

文章目录一、简答题&#xff08;历年真题&#xff09;18年10月-22年10月历年简答题出题情况分析2018年10月2019年4月2019年10月2020年8月2020年10月2021年4月2021年10月2022年4月2022年10月二、综合题&#xff08;历年真题&#xff09;2018年10月2019年4月2019年10月2020年8月2…...

计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing

投稿信的准备 期刊的编辑往往需要一些有关作者及其论文的信息。 而作者也希望给编辑提供一些有助于其全文送审及决策的信息。 这些信息都应该包括在投稿信中。 投稿信应包括以下几方面的内容&#xff1a; 文题和所有作者的姓名;稿件适宜的栏目; 为什么此论文适合于在该刊而…...

Allegro如何刷新封装和库里的封装同步操作指导

Allegro如何刷新封装和库里的封装同步操作指导 在做PCB设计的过程中,有时会因为库里的封装有更新,所以PCB上使用到了这个封装时候需要和库里的同步,如下图 如何刷新,具体操作如下 点击Place点击Update Symbols...

基于Vue3手写选课组件(含时区切换,拖拽选择)

环境说明 基于vue3vite 无关联别的ui框架&#xff0c;组件化 初次使用vue3&#xff0c;技术菜&#xff0c;大佬勿喷 main.ts "moment": "^2.29.4","moment-timezone": "^0.5.41",import moment from moment; import momentTz from &…...

准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!

谷歌开发者专家 (Google Developer Experts&#xff0c;GDE)&#xff0c;又称谷歌开发者专家项目&#xff0c;是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…...

搭建帮助中心的 8 个最佳工具

网站帮助中心的作用通过向客户表明您了解他们所面临的问题以及如何提供帮助来建立信任&#xff1b;通过回答常见问题来改善客户服务&#xff0c;增强专业的品牌形象&#xff1b;通过减少重复发送给支持人员的电话和电子邮件&#xff0c;节省时间和金钱&#xff1b;增强您在搜索…...

LQB小板焊接V3版本的小板原理图,PCB图,注意事项和步骤

第一部分&#xff0c;这个部分&#xff0c;可以不焊接&#xff0c;直接用买的下载器进行下载代码&#xff0c;外接一个下载器&#xff0c;网上大概是10元左右&#xff0c;以后学习stm32的芯片的时候&#xff0c;这个下载器就是一个串口转换器&#xff0c;也可以使用。。 当然也…...

华为OD机试真题Python实现【翻转单词顺序】真题+解题思路+代码(20222023)

翻转单词顺序 题目 输入一个英文文章片段 翻转指定区间的单词顺序,标点符号和普通字母一样处理 例如输入字符串 I am a developer. 区间[0,3]则输出 developer. a am I 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 ## 输入 使用换行隔…...

微机原理和计算机组成原理复习

1&#xff1a;冯诺依曼机器的主要特点&#xff1f; 1&#xff09;计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成&#xff1b; 2&#xff09;指令和数据存储在存储器中&#xff0c;并可以按地址访问&#xff1b; 3&#xff09;指令和数据均以二进制表示&…...

mysql5.7.33安装配置教程【保姆级安装教程】

MySQL5.7.33安装教程 1、官方网站下载 点击这里跳转页面下载 1.1、看下你是什么系统&#xff0c;系统是64位还是32位 2、解压到D盘跟路径或者其下面纯英文路径 2.1、可见它没有data、log等文件夹&#xff0c;不需手动添加(下面执行命令自动初始化)&#xff01;&#xff01; …...

每天都和时间序列打交道,我总结了这篇文章!

Datawhale干货 作者&#xff1a;戳戳龍&#xff0c;上海交通大学&#xff0c;量化算法工程师前言&#x1f534; 平时工作中每天都在和时间序列打交道&#xff0c;对时间序列分析进行研究是有必要的&#x1f7e1; 分享和交流一些自己的在时序处理方面的心得&#xff0c;提供一…...

【Leetcode——重排链表】

文章目录一、重排链表思路1.思路2.总结一、重排链表 对于这道题&#xff0c;有两种思路&#xff1a; 思路1. 1.使用一个线性表&#xff0c;存储链表中的每个节点&#xff0c;然后按照题目的条件&#xff0c;来链接线性表的各个节点即可。 使用左下标和右下标来定位线性表中的…...

HCIP总结(一)

抽象语言---编码---二进制---电信号----处理电信号 &#xff08;电脑工作流程&#xff09; OSI参考模型 ----OSI/RM (核心思想&#xff1a;分层) 应用层----提供各种应用服务&#xff0c;将抽象语言转换成编码&#xff0c;提供人机交互的接口 表示层----将编码转换成二进制 …...

华为OD机试真题Python实现【黑板上色】真题+解题思路+代码(20222023)

题目 疫情过后希望小学终于又重新开学了,3 年 2 班开学第一天的任务是将后面的黑板报重新制作, 黑板上已经写上了N个正整数,同学们需要给这每个数分别上一种颜色, 为了让黑板报既美观又有学习意义,老师要求同种颜色的所有数都可以被这个颜色中最小的那个数整除, 现在帮小…...

C++中的利器——模板

前文本文主要是讲解一下C中的利器——模板&#xff0c;相信铁子们在学完这一节后&#xff0c;写代码会更加的得心应手&#xff0c;更加的顺畅。一&#xff0c;泛型编程想要学习模板&#xff0c;我们要先了解为什么需要模板&#xff0c;我们可以看看下面这个程序。int add(int&a…...

k8s控制器

目录 一、控制器简介 二、控制器类型 1、RC和RS 2、Deployment 3、DaemonSet 4、Job 5、CronJob 6、StateFulSet 7、HPA 一、控制器简介 在kubernetes中&#xff0c;按照Pod的创建方式可以将其分为两类&#xff1a; 自主式:kubernetes直接创建出来的Pod&#xff0c;…...

嵌入式学习笔记——认识STM32的 GPIO口

寄存器开发STM32GPIO口前言认识GPIOGPIO是什么GPIO有什么用GPIO怎么用STM32上GPIO的命名以及数量GPIO口的框图&#xff08;重点&#xff09;输入框图解析三种输入模式GPIO输入时内部器件及其作用1.保护二极管2.上下拉电阻&#xff08;可配置&#xff09;3.施密特触发器4.输入数…...

类和对象(中)

文章目录 继承的概念继承的语法父类成员访问super关键字子类构造方法super和this初始化protected关键字继承方式final关键字继承与组合一、继承的概念 继承(inheritance)机制&#xff1a;是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类…...

Java——单词接龙

题目链接 leetcode在线oj题——单词接龙 题目描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&#xff…...

HTML DOM 事件监听器

通过JavaScript&#xff0c;我们可以给页面的某些元素添加事件的监听器&#xff0c;当元素触发相应事件的时候监听器就会捕捉到这个事件并执行相应的代码。addEventListener() 方法实例当用户点击按钮时触发监听事件&#xff1a;document.getElementById("myBtn").ad…...

java基本数据类型取值范围

在JAVA中一共有八种基本数据类型&#xff0c;他们分别是 byte、short、int、long、float、double、char、boolean 整型 其中byte、short、int、long都是表示整数的&#xff0c;只不过他们的取值范围不一样 byte的取值范围为-128~127&#xff0c;占用1个字节&#xff08;-2的…...

建设网站西丽/最专业的seo公司

文章目录 前言I、定时器的基本用法1.1 添加计时器1.2 往运行循环添加timer1.3 保证定时器的运行不受UI事件影响II 停止定时器的方案2.1 invalidate的用法2.2 FireDate的用法III CADisplayLink 与 NSTimer 有什么不同?3.1 精确度3.2 使用场合3.3 注意事项IV、使用CALayer 实现时…...

网站建设公司用的什么后台/合肥关键词排名工具

Windbg工作中用的不多&#xff0c;所以命令老是记不住&#xff0c;每次使用都要重新查命令&#xff0c;挺烦。趁这次培训的机会好好测试和总结了一下&#xff0c;下次再用就方便多了。在这里一起共享一下&#xff0c;如果有错误&#xff0c;请指正。基本知识和常用命令 &#x…...

外链代发平台/seo推广收费标准

2019独角兽企业重金招聘Python工程师标准>>> Linux在安装好之后通常SELinux都是出于默认开启的状态&#xff0c;开启的情况下会导致一些服务的安装不成功。 在不需要的情况下完全可以关闭掉,下面是在centos 7.0里面如何查看&#xff0c;关闭selinux。 查看selinux状…...

沈阳网站制作定制厂家/东莞外贸推广公司

http://blog.csdn.net/pipisorry/article/details/36633451 博客内容&#xff1a; &#xff08;个性化&#xff09;推荐系统构建三大方法&#xff1a;基于内容的推荐content-based&#xff0c;协同过滤collaborative filtering&#xff0c;隐语义模型(LFM, latent factor model…...

最新版在线 网/百度seo运营工作内容

这是在网上找到的一张流程图&#xff0c;写的比较好&#xff0c;大家可以先看图&#xff0c;然后看详细阅读下面的各个步骤。执行流程&#xff1a;1.连接验证及解析客户端与MySQL Server建立连接&#xff0c;发送语句给MySQL Server&#xff0c;接收到后会针对这条语句创建一个…...

网站降权 垃圾外链/搜索引擎推广

全文转发 http://www.cnblogs.com/fnng/p/3576154.html 在我们日常上网浏览网页的时候&#xff0c;经常会看到一些好看的图片&#xff0c;我们就希望把这些图片保存下载&#xff0c;或者用户用来做桌面壁纸&#xff0c;或者用来做设计的素材。 我们最常规的做法就是通过鼠标右键…...