news 2026/5/1 19:02:09

2025数据结构实验八:排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2025数据结构实验八:排序

第1关:插入排序与选择排序

#include<iostream> using namespace std; #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef struct SqList { int *R; //顺序表基地址,元素存储位置为[1..length] int length; }SqList; void InsertSort(SqList &L) { //对顺序表L进行直接插入排序 int i, j; for (i = 2; i <= L.length; i++) { // 从第2个元素开始(第1个元素默认已排序) if (L.R[i] < L.R[i-1]) { // 当前元素比前一个元素小,需要插入 L.R[0] = L.R[i]; // 哨兵暂存当前元素 L.R[i] = L.R[i-1]; // 前一个元素后移 for (j = i-2; L.R[0] < L.R[j]; j--) { // 向前找插入位置 L.R[j+1] = L.R[j]; // 元素后移 } L.R[j+1] = L.R[0]; // 插入到正确位置 } } } void SelectSort(SqList &L) { //对顺序表L进行简单选择排序 int i, j, min_idx; for (i = 1; i <= L.length-1; i++) { // 第i趟排序,确定第i个位置的元素 min_idx = i; // 假设当前位置是最小值下标 for (j = i+1; j <= L.length; j++) { // 遍历未排序部分找最小值 if (L.R[j] < L.R[min_idx]) { min_idx = j; // 更新最小值下标 } } if (min_idx != i) { // 若最小值不在当前位置,交换 int temp = L.R[i]; L.R[i] = L.R[min_idx]; L.R[min_idx] = temp; } } }

第2关:快速排序

#include<iostream> using namespace std; #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef struct SqList { int *R; //顺序表基地址,元素存储位置为[1..length] int length; }SqList; int Partition(SqList &L,int low,int high) { //实现快速排序的划分算法:以L.R[low]为基准,划分[low..high] L.R[0] = L.R[low]; // 哨兵暂存基准元素 while (low < high) { // 从右向左找小于基准的元素 while (low < high && L.R[high] >= L.R[0]) { high--; } L.R[low] = L.R[high]; // 小于基准的元素放到左部 // 从左向右找大于基准的元素 while (low < high && L.R[low] <= L.R[0]) { low++; } L.R[high] = L.R[low]; // 大于基准的元素放到右部 } L.R[low] = L.R[0]; // 基准元素放到最终位置 return low; // 返回基准元素的下标 } void QSort(SqList &L,int low,int high) { //实现快速排序算法,对顺序表L[low..high]进行快速排序 if (low < high) { int pivot = Partition(L, low, high); // 划分得到基准位置 QSort(L, low, pivot - 1); // 递归排序左子序列 QSort(L, pivot + 1, high); // 递归排序右子序列 } }

第3关:奇偶元素移动

#include<iostream> using namespace std; #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef struct SqList { int *R; //顺序表基地址,元素存储位置为[1..length] int length; }SqList; void move(SqList L) { //将顺序表所有的奇数都移动到偶数之前 int low = 1; // 左指针(从第一个元素开始) int high = L.length; // 右指针(从最后一个元素开始) while (low < high) { // 左指针找偶数(找到则暂停) while (low < high && L.R[low] % 2 != 0) { low++; } // 右指针找奇数(找到则暂停) while (low < high && L.R[high] % 2 == 0) { high--; } // 交换左指针的偶数和右指针的奇数 if (low < high) { int temp = L.R[low]; L.R[low] = L.R[high]; L.R[high] = temp; } } }

第4关:第k小的数

#include<iostream> using namespace std; #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef struct SqList { int *R; //顺序表基地址,元素存储位置为[1..length] int length; }SqList; // 快速选择的划分函数(同快速排序的Partition) int Partition(SqList &L, int low, int high) { L.R[0] = L.R[low]; // 哨兵暂存基准元素 while (low < high) { // 右指针找小于基准的元素 while (low < high && L.R[high] >= L.R[0]) { high--; } L.R[low] = L.R[high]; // 左指针找大于基准的元素 while (low < high && L.R[low] <= L.R[0]) { low++; } L.R[high] = L.R[low]; } L.R[low] = L.R[0]; return low; // 返回基准的最终位置 } int kth_elem(SqList L,int k) { //实现函数,返回顺序表内第k小的元素的值,若不存在返回-1 if (k < 1 || k > L.length) { // 检查k的合法性 return -1; } int low = 1, high = L.length; while (low <= high) { int pivot = Partition(L, low, high); // 划分后基准的位置 if (pivot == k) { // 基准位置恰好是第k小元素 return L.R[pivot]; } else if (pivot > k) { // 第k小元素在左半部分 high = pivot - 1; } else { // 第k小元素在右半部分 low = pivot + 1; } } return -1; // 理论上不会走到这一步 }

第5关:单链表排序

#include <iostream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef struct LNode { int data; struct LNode *next; }LNode, *LinkList; void ListSort(LinkList &L) { // 对带头结点的单链表L进行直接插入排序 if (L == NULL || L->next == NULL) { return; // 空链表或只有头结点,无需排序 } LNode *sorted = L->next; // 已排序部分的尾节点(初始为第一个有效节点) LNode *unsorted = sorted->next; // 未排序部分的头节点 sorted->next = NULL; // 已排序部分初始为单个节点,断开与后续的连接 while (unsorted != NULL) { LNode *curr = unsorted; // 当前待插入节点 unsorted = unsorted->next; // 未排序部分后移 // 找到curr在已排序部分的插入位置(prev的下一个节点应大于curr) LNode *prev = L; // 从头结点开始找前驱 while (prev->next != NULL && prev->next->data < curr->data) { prev = prev->next; } // 将curr插入到prev和prev->next之间 curr->next = prev->next; prev->next = curr; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 16:59:33

Whisper大模型加速版:8倍速度突破的语音识别新标杆

Whisper大模型加速版&#xff1a;8倍速度突破的语音识别新标杆 【免费下载链接】whisper-large-v3-turbo 项目地址: https://ai.gitcode.com/hf_mirrors/openai/whisper-large-v3-turbo 在人工智能语音识别技术飞速发展的今天&#xff0c;性能与效率的平衡成为业界关注…

作者头像 李华
网站建设 2026/4/26 0:29:05

LongCat-Video:13.6亿参数开源视频生成模型,5分钟长视频创作革命

LongCat-Video&#xff1a;13.6亿参数开源视频生成模型&#xff0c;5分钟长视频创作革命 【免费下载链接】LongCat-Video 项目地址: https://ai.gitcode.com/hf_mirrors/meituan-longcat/LongCat-Video 还在为视频制作发愁吗&#xff1f;传统视频创作需要专业设备、复杂…

作者头像 李华
网站建设 2026/5/1 15:38:43

【AI实验】基于最小拍控制的直流电机离散控制系统设计与实现

摘要在现代工业自动化和运动控制领域&#xff0c;直流电机作为最基础的执行机构&#xff0c;其转速控制性能直接影响整个系统的运行质量。传统连续控制方法虽然成熟&#xff0c;但在数字化时代已难以满足高精度、强抗干扰、低成本的综合需求。为此&#xff0c;本文深入研究了基…

作者头像 李华
网站建设 2026/4/30 21:40:54

量化感知训练:提升TensorFlow模型边缘部署效率

量化感知训练&#xff1a;提升TensorFlow模型边缘部署效率 在智能摄像头、可穿戴设备和工业传感器日益普及的今天&#xff0c;一个现实问题摆在开发者面前&#xff1a;如何让复杂的深度学习模型在内存仅几十MB、算力有限的嵌入式设备上稳定运行&#xff1f;直接将训练好的浮点模…

作者头像 李华
网站建设 2026/5/1 2:32:47

2025机顶盒刷机包下载大全中Bootloader修改实践

玩转老机顶盒&#xff1a;从Bootloader修改到定制系统重生你家角落那台早已落灰的机顶盒&#xff0c;是不是早就被智能电视或网络盒子取代了&#xff1f;其实它还没“退休”——只要动一动手&#xff0c;就能让它摇身一变成为运行LibreELEC的家庭影院中心、轻量Linux服务器&…

作者头像 李华
网站建设 2026/4/25 3:20:42

让你大开眼界的网页无障碍(Accessibility)测试秘诀

我们每天浏览网页获取信息&#xff0c;可能未曾意识到这对于许多残障人士而言却不是一件容易的事情。肢体障碍用户可能仅能依靠键盘进行导航&#xff0c;视障用户依赖屏幕阅读器将内容转化为语音或盲文。如果网站在设计时忽略了这些多样化的交互方式&#xff0c;就等于在数字世…

作者头像 李华