南京师范大学计电院数据结构课设——排序算法

1 排序算法

1.1 题目要求

编程实现希尔、快速、堆排序、归并排序算法。要求首先随机产生10000个数据存入磁盘文件,然后读入数据文件,分别采用不同的排序方法进行排序并将结果存入文件中。

1.2 算法思想描述

1.2.1 随机数生成

当需要生成一系列随机数时,常常需要使用随机函数。然而,传统的rand()函数所生成的数据并不能被视为真正的随机数,因其仅限于某个特定范围内的值,并且在多次运行同一rand()函数时,所产生的随机数序列是完全一致的,缺乏真正的随机性。为此,我们需要借助srand()函数来设置rand()函数生成随机数时的种子值,通过不同的种子值,我们可以获得不同的随机数序列。

为了实现更接近真正随机数的序列生成,一种常见的做法是利用srand((int)time(NULL))的方式,即利用系统时钟来产生随机数种子。该方法将当前时间转换为一个整数,并将其作为srand()函数的参数,以初始化随机数生成器的种子值。由于时间的变化是无法预测的,因此每次程序运行时都会获得一个不同的种子值,从而产生不同的随机数序列。

图1.1 随机生成数示例代码

1.2.2 希尔排序

希尔排序(Shell Sort)是一种基于插入排序的排序算法,它通过将待排序的元素按照一定的间隔分组,对每组进行插入排序,随着间隔逐渐减小,最终使得整个序列达到有序状态。

下面是希尔排序的基本思想和实现步骤:

  1. 选择一个间隔序列(称为增量序列),通常初始间隔为数组长度的一半,然后逐步缩小间隔直到为1。
  2. 对于每个间隔,将数组分成多个子序列,子序列的元素之间相隔间隔个位置。
  3. 对每个子序列进行插入排序,即将子序列中的元素按照插入排序的方式进行排序。
  4. 重复步骤2和步骤3,直到间隔为1时,进行最后一次插入排序。

图1.2 希尔排序示例代码

1.2.3 快速排序

快速排序(Quick Sort)是一种高效的排序算法,它采用分治法(Divide and Conquer)策略来排序一个数组。快速排序的基本思想是选择一个基准元素(pivot),将数组分割成两个子数组,其中一个子数组的元素都比基准元素小,另一个子数组的元素都比基准元素大,然后对这两个子数组分别进行递归排序,最终将整个数组排序完成。

图1.3 快速排序示例代码

1.2.4 堆排序

堆排序(Heap Sort)是一种利用堆数据结构进行排序的算法。堆是一种完全二叉树,具有以下性质:对于每个节点i,其父节点的值小于等于节点i的值(最大堆),或者父节点的值大于等于节点i的值(最小堆)。在堆排序中,我们使用最大堆来进行排序。

下面是堆排序的基本思想和实现步骤:

  1. 把无序数组构建成二叉堆。
  2. 循环删除堆顶元素,移到集合尾部,调节堆产生新的堆顶。
  3. 当删除一个最大堆的堆顶(并不是完全删除,而是替换到最后面),经过自我调节,第二大的元素就会被交换上来,成为最大堆的新堆顶。由于这个特性,我们每一次删除旧堆顶,调整后的新堆顶都是大小仅次于旧堆顶的节点。那么我们只要反复删除堆顶,反复调节二叉堆,所得到的集合就成为了一个有序集合。

图1.4 堆排序示例代码

1.2.5 归并排序

归并排序(Merge Sort)是一种基于分治法(Divide and Conquer)的排序算法,它将待排序的数组逐步分割成较小的子数组,然后将这些子数组逐个合并,最终得到一个有序的数组。合并2个数组的称为2路归并,合并3个数组的称为3路归并,多路归并。归并排序是稳定的。

图1.5 归并排序示例代码

1.3 程序设计

1.3.1 程序设计思路

图1.6 程序设计思路图

1.3.2 生成input.txt文件

先创建一个文件并打开,然后生成随机数存储到该文件中作为后续的输入文件。

图1.7 生成input.txt文件代码

1.3.3 生成排序结果文件

首先完成文件的存入函数,再分别调用不同的排序算法完成排序再存入对应的文件中。

图1.8将数据存入文件代码

图1.9 排序并存入文件代码

1.3.4完整代码(C++)

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>// 生成随机数并保存到文件
void generateRandomNumbers(const std::string& filename, int count) {std::ofstream file(filename);if (!file.is_open()) {std::cout << "无法打开文件:" << filename << std::endl;return;}else{std::cout << "生成成功"<<std::endl;}srand(time(NULL));for (int i = 0; i < count; ++i) {int num = rand() % 100000;  // 生成0到99999之间的随机数file << num << std::endl;}file.close();
}// 从文件中读取数据
std::vector<int> readNumbersFromFile(const std::string& filename) {std::vector<int> numbers;std::ifstream file(filename);if (!file.is_open()) {std::cout << "无法打开文件:" << filename << std::endl;return numbers;}int num;while (file >> num) {numbers.push_back(num);}file.close();return numbers;
}// 将数据存入文件
void writeNumbersToFile(const std::string& filename, const std::vector<int>& numbers) {std::ofstream file(filename);if (!file.is_open()) {std::cout << "无法打开文件:" << filename << std::endl;return;}else{std::cout << "存入成功"<<std::endl;}for (int num : numbers) {file << num << std::endl;}file.close();
}// 希尔排序
void shellSort(std::vector<int>& numbers) {int n = numbers.size();for (int gap = n / 2; gap > 0; gap /= 2) {for (int i = gap; i < n; ++i) {int temp = numbers[i];int j = i;while (j >= gap && numbers[j - gap] > temp) {numbers[j] = numbers[j - gap];j -= gap;}numbers[j] = temp;}}
}// 快速排序
void quickSort(std::vector<int>& numbers, int low, int high) {if (low < high) {int pivot = numbers[high];int i = low - 1;for (int j = low; j <= high - 1; ++j) {if (numbers[j] < pivot) {++i;std::swap(numbers[i], numbers[j]);}}std::swap(numbers[i + 1], numbers[high]);int partitionIndex = i + 1;quickSort(numbers, low, partitionIndex - 1);quickSort(numbers, partitionIndex + 1, high);}
}// 堆排序
void heapify(std::vector<int>& numbers, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && numbers[left] > numbers[largest])largest = left;if (right < n && numbers[right] > numbers[largest])largest = right;if (largest != i) {std::swap(numbers[i], numbers[largest]);heapify(numbers, n, largest);}
}void heapSort(std::vector<int>& numbers) {int n = numbers.size();for (int i = n / 2 - 1; i >= 0; --i)heapify(numbers, n, i);for (int i = n - 1; i >= 0; --i) {std::swap(numbers[0], numbers[i]);heapify(numbers, i, 0);}
}// 归并排序
void merge(std::vector<int>& numbers, int left, int middle, int right) {int n1 = middle - left + 1;int n2 = right - middle;std::vector<int> leftArr(n1);std::vector<int> rightArr(n2);for (int i = 0; i < n1; ++i)leftArr[i] = numbers[left + i];for (int j = 0; j < n2; ++j)rightArr[j] = numbers[middle + 1 + j];int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (leftArr[i] <= rightArr[j]) {numbers[k] = leftArr[i];++i;}else {numbers[k] = rightArr[j];++j;}++k;}while (i < n1) {numbers[k] = leftArr[i];++i;++k;}while (j < n2) {numbers[k] = rightArr[j];++j;++k;}
}void mergeSort(std::vector<int>& numbers, int left, int right) {if (left < right) {int middle = left + (right - left) / 2;mergeSort(numbers, left, middle);mergeSort(numbers, middle + 1, right);merge(numbers, left, middle, right);}
}int main() {// 生成随机数并保存到文件generateRandomNumbers("input.txt", 10000);// 从文件中读取数据std::vector<int> numbers = readNumbersFromFile("input.txt");// 复制数据用于各种排序算法std::vector<int> numbersShell = numbers;std::vector<int> numbersQuick = numbers;std::vector<int> numbersHeap = numbers;std::vector<int> numbersMerge = numbers;// 希尔排序shellSort(numbersShell);// 将结果存入文件writeNumbersToFile("shell_sorted.txt", numbersShell);// 快速排序quickSort(numbersQuick, 0, numbersQuick.size() - 1);// 将结果存入文件writeNumbersToFile("quick_sorted.txt", numbersQuick);// 堆排序heapSort(numbersHeap);// 将结果存入文件writeNumbersToFile("heap_sorted.txt", numbersHeap);// 归并排序mergeSort(numbersMerge, 0, numbersMerge.size() - 1);// 将结果存入文件writeNumbersToFile("merge_sorted.txt", numbersMerge);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT 正测试Android屏幕小组件;联想ThinkBook 推出透明笔记本电脑

▶ ChatGPT 测试屏幕小组件 近日 ChatGPT 正在测试 Android 平台上的屏幕小组件&#xff0c;类似于手机中的悬浮窗&#xff0c;按住 Android 手机主屏幕上的空白位置就可以调出 ChatGPT 的部件菜单。 菜单中提供了许多选项&#xff0c;包括文本、语音和视频查询的快捷方式&…

微信小程序引入Vant插件

Vant官网&#xff1a;Vant Weapp - 轻量、可靠的小程序 UI 组件库 先查看官网的版本 新建一个package.json页面&#xff0c;代码写上&#xff1a;&#xff08;我先执行的npm安装没出package页面&#xff0c;所以先自己创建了一个才正常&#xff09; {"dependencies"…

LeetCode 刷题 [C++] 第54题.螺旋矩阵

题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 题目分析 根据题意可知&#xff0c;我们不需要记录已经走过的路径&#xff0c;只需要通过调整矩阵的上下左右边界即可完成任务&#xff1b;首先创建出矩阵…

NerfStudio安装及第一个场景重建

NerfStudio文档是写在windows和linux上安装&#xff0c;本文记录Linux安装的过程&#xff0c;且我的cuda是11.7 创建环境 conda create --name nerfstudio -y python3.8 conda activate nerfstudio python -m pip install --upgrade pip Pytorch要求2.0.1之后的,文档推荐cud…

深度学习 精选笔记(5)多层感知机

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

LeetCode 热题 100 | 图论(上)

目录 1 200. 岛屿数量 2 994. 腐烂的橘子 2.1 智障遍历法 2.2 仿层序遍历法 菜鸟做题&#xff0c;语言是 C 1 200. 岛屿数量 解题思路&#xff1a; 遍历二维数组&#xff0c;寻找 “1”&#xff08;若找到则岛屿数量 1&#xff09;寻找与当前 “1” 直接或间接连接在…

【PHP】Workerman开源应用容器的GatewayWorker 与 iOS-OC对接

Workerman 开源高性能PHP应用容器 workerman是一款开源高性能PHP应用容器,它大大突破了传统PHP应用范围,被广泛的用于互联网、即时通讯、APP开发、硬件通讯、智能家居、物联网等领域的开发。 PHPSocket.io PHP版本的socket.io,具有良好的客户端兼容性,常用于即时通讯领域…

uniapp android 原生插件开发-测试流程

前言 最近公司要求研究一下 uniapp 的 android 原生插件的开发&#xff0c;为以后的工作做准备。这篇文章记录一下自己的学习过程&#xff0c;也帮助一下有同样需求的同学们 : ) 一、下载安装Hbuilder X , Android studio&#xff08;相关的安装配置过程网上有很多&#xff0c;…

git忽略某些文件(夹)更改方法

概述 在项目中,常有需要忽略的文件、文件夹提交到代码仓库中,在此做个笔录。 一、在项目根目录内新建文本文件,并重命名为.gitignore,该文件语法如下 # 以#开始的行,被视为注释. # 忽略掉所有文件名是 a.txt的文件. a.txt # 忽略所有生成的 java文件, *.java # a.j…

C#,数组数据波形排序(Sort in Wave Form)的朴素算法与源代码

1 波形排序 所谓“波形排序”就是一大一小。 将n个身高互不相同的人排成一行 ,对于每个人 ,要求他要么比相邻的人均高 ,要么比相邻的人均矮 ,问共有多少种排法 ,这一问题称为波形排列问题。 2 源程序 using System; using System.Collections; using System.Collections.Gen…

新能源汽车交流充电桩开发介绍

概述 最些年&#xff0c;随着新能源行业迅猛发展&#xff0c;充电桩市场缺口非常大&#xff0c;越来越多的公司和人涌入这个行业。充电桩作为新能源行业解决新能源汽车续航的存在&#xff0c;竞争也非常大。除了一些初创公司外&#xff0c;从行业开始国企央企就参与其中&#x…

【MySQL | 第一篇】undo log、redo log、bin log三者之间的区分?

undo log、redo log、bin log三者之间的区分&#xff1f; 从 产生的时间点、日志内容、用途 三方面展开论述即可 1.undo log——撤销日志 时间点&#xff1a;事务开始之前产生&#xff0c;根据当前版本的数据生成一个undo log&#xff0c;也保存在事务开始之前 作用&#xf…

分享three.js和cannon.js构建Web 3D场景

使用 three.js&#xff0c;您不再需要花哨的游戏PC或控制台来显示逼真的3D图形。 您甚至不需要下载特殊的应用程序。现在每个人都可以使用智能手机和网络浏览器体验令人惊叹的3D应用程序。 这个惊人的库和充满活力的社区是您在浏览器、笔记本电脑、平板电脑或智能手机上创建游…

《成才之路》是什么级别的期刊?是知网学术期刊吗?能评职称吗?

问题解答 问&#xff1a;《成才之路》是什么级别刊物&#xff1f; 答&#xff1a;省级 问&#xff1a;《成才之路》是知网学术期刊吗&#xff1f; 答&#xff1a;是的&#xff0c;第二批学术目录内期刊 问&#xff1a;《成才之路》是正规期刊吗&#xff1f; 答&#xff1a…

使用ffmpeg压缩视频

一、到ffmpeg官网下载文件包&#xff1a; Download FFmpeg 下载后找到 bin 下的3个exe文件&#xff0c;复制到自己本机的某个目录下, 如&#xff1a; 二、使用命令行压缩&#xff1a; ffmpeg -i input.mp4 -c:v libx265 -crf 28 -y output.mp4 这条命令使用 FFmpeg 工具对输…

OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;使用YOLOv8做目标检测、实例分割和图像分类 0 导 读 本文主要介绍YOLOv8及使用它做目标检测、实例分割和图像分类演示&#xff0c;仅供参考。…

Swagger3 使用详解

Swagger3 使用详解 一、简介1 引入依赖2 开启注解3 增加一个测试接口4 启动服务报错1.5 重新启动6 打开地址&#xff1a;http://localhost:8093/swagger-ui/index.html 二、Swagger的注解1.注解Api和ApiOperation2.注解ApiModel和ApiModelProperty3.注解ApiImplicitParams和Api…

Leetcoder Day26| 回溯part06:总结+三道hard题

332.重新安排行程 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个成员分别表示飞机出发和降落的机场地点&#xff0c;对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

【学习总结】什么是弹性负载均衡? LB和ELB的区别

[Q&A] 什么是 LB (Load Balancer) 负载均衡器&#xff1a; 这是一个广泛的概念&#xff0c;泛指任何用于在网络流量进入时进行分配以实现服务器集群间负载均衡的设备或服务。传统的负载均衡器可以是硬件设备&#xff0c;也可以是软件解决方案&#xff0c;其基本目标是将客…

团结引擎——DotNet Wasm方案

参考&#xff1a;团结引擎 DotNet WebAssembly(Wasm) 介绍 一、当前编译流程 通过IL2CPP将C#转成C/C&#xff1b;通过Emscripen将C/C转成WebAssembly&#xff1b; 二、 当前存在问题 IL2CPP在处理类似泛型、反射结构时&#xff0c;由于缺少运行时信息&#xff0c;必须全量生…