数据结构实验八:排序的应用

news2024/11/16 9:29:38

目录

一、实验目的

二、实验原理

1.直接插入排序

2.快速排序

三、实验内容

实验1

代码

截图 

实验2

代码

截图

 


一、实验目的

1、掌握排序的基本概念;

2.掌握并实现以下排序算法:直接插入排序、快速排序。

二、实验原理

1.直接插入排序

其基本思想是将一个待排序的元素插入到已经排好序的部分。

  1. 从第二个元素开始,将当前元素插入到已经排好序的序列中。
  2. 将当前元素依次与已排序序列中的元素比较,找到合适的位置插入。
  3. 重复以上步骤,直到所有元素都有序。
void insertion_sort(int arr[], int num) {
	for (int i = 1; i < num; i++) {
		int start = 0;//已排序好的数组中待排序的元素最后所在的位置
		int end = i;//加上待排序的元素的数组的最后一个元素的位置
		int temp = arr[i];
		for (int j = i - 1; j >= 0; j--) {//从后往前找到已排序的数组中第一个比待排序元素小的位置
			if (arr[i] > arr[j]) {
				start = j+1;
				break;
			}
		}
		for (int i = end; i > start; i--) {//比待排序元素大的都后移
			arr[i] = arr[i - 1];
		}
		arr[start] = temp;
	}
	return;
}

2.快速排序

 其基本思想是选择一个基准元素,将数组划分为左右两个子数组,使得左边的元素都小于等于基准,右边的元素都大于等于基准,然后对左右子数组递归地应用快速排序。

  1. 选择基准元素(Pivot): 从数组中选择一个元素作为基准元素。通常选择数组中的最后一个元素。

  2. 划分阶段: 将数组中小于等于基准的元素放在基准的左侧,将大于等于基准的元素放在基准的右侧。这个过程称为划分(Partitioning)。

    • 初始化两个指针,i 指向数组的起始位置,j 指向数组的结束位置。
    • 从左到右找到第一个大于基准的元素,从右到左找到第一个小于基准的元素,交换它们的位置。
    • 重复上述步骤,直到 i 大于等于 j
    • 将基准元素与 i 所指位置的元素交换。
  3. 递归排序: 对划分得到的两个子数组分别递归地应用快速排序。

    • 对左侧子数组递归调用快速排序:quick_sort(arr, low, pi - 1)
    • 对右侧子数组递归调用快速排序:quick_sort(arr, pi + 1, high)
  4. 合并结果: 在递归的最后阶段,数组会变得有序。整个过程重复直到整个数组排序完成。

//交换两个元素
void swap(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}

// 根据基准元素将数组划分为两个子数组,并返回基准元素的位置
int partition(int arr[], int low, int high) {
	int pivot = arr[high];
	int i = (low - 1);

	for (int j = low; j <= high - 1; j++) {
		if (arr[j] <= pivot) {
			i++;
			swap(&arr[i], &arr[j]);
		}
	}
	swap(&arr[i + 1], &arr[high]);
	return i + 1;
}

// 快速排序函数
void quick_sort(int arr[], int low, int high) {
	if (low < high) {
		int pi = partition(arr, low, high);

		// 递归地对左右子数组进行排序
		quick_sort(arr, low, pi - 1);
		quick_sort(arr, pi + 1, high);
	}
}

三、实验内容

实验1

使用直接插入排序算法对序列{49,38,65,97,76,13,27,49}进行从小到大排序,并且输出每一趟排序的结果。

代码

#include<iostream>
using namespace std;

void insertion_sort(int arr[], int num) {
	for (int i = 1; i < num; i++) {
		int start = 0;//已排序好的数组中待排序的元素最后所在的位置
		int end = i;//加上待排序的元素的数组的最后一个元素的位置
		int temp = arr[i];
		for (int j = i - 1; j >= 0; j--) {//从后往前找到已排序的数组中第一个比待排序元素小的位置
			if (arr[i] > arr[j]) {
				start = j+1;
				break;
			}
		}
		for (int i = end; i > start; i--) {//比待排序元素大的都后移
			arr[i] = arr[i - 1];
		}
		arr[start] = temp;
		for (int i = 0; i < 8; i++) {
			cout << arr[i] << " ";
		}
		cout << endl;
	}
	return;
}
int main() {
	int arr1[8] = { 49,38,65,97,76,13,27,49 };
	cout << "直接插入排序结果为" << endl;
	insertion_sort(arr1, 8);
	return 0;
}

截图 

实验2

使用快速排序算法对序列{49,38,65,97,49,13,27,76}进行从小到大排序,并且输出每一趟排序的结果。 

代码

#include<iostream>
using namespace std;

#include<iostream>
using namespace std;

//交换两个元素
void swap(int* a, int* b) {
	int temp = *a;
	*a = *b;
	*b = temp;
}

// 根据基准元素将数组划分为两个子数组,并返回基准元素的位置
int partition(int arr[], int low, int high) {
	int pivot = arr[high];
	int i = (low - 1);

	for (int j = low; j <= high - 1; j++) {
		if (arr[j] <= pivot) {
			i++;
			swap(&arr[i], &arr[j]);
		}
	}
	swap(&arr[i + 1], &arr[high]);
	return i + 1;
}

// 快速排序函数
void quick_sort(int arr[], int low, int high) {
	if (low < high) {
		int pi = partition(arr, low, high);
		for (int i = 0; i < 8; i++) {
			cout << arr[i] << " ";
		}
		cout << endl;
		// 递归地对左右子数组进行排序
		quick_sort(arr, low, pi - 1);
		quick_sort(arr, pi + 1, high);
	}
}

int main() {
	int arr1[8] = { 49,38,65,97,76,13,27,49 };
	cout << "快速排序结果为" << endl;
	quick_sort(arr1,0, 7);
	return 0;
}

截图

 

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

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

相关文章

RK3399ProD开发板的固件烧录实战

参考 Toybrick-开源社区-TB-RK3399ProD-RK3399ProD开发板的固件烧录教程 https://download.csdn.net/download/quantum7/88769396 环境 主机&#xff1a;win10 开发板&#xff1a;TB-RK3399ProD 烧录工具&#xff1a;FlashTool_CN\Windows\AndroidTool.exe 串口驱动&#xf…

14.5 Flash查询和添加数据库数据

14.5 Flash查询和添加数据库数据 在Flash与数据库通讯的实际应用中&#xff0c;如何实现用户的登录与注册是经常遇到的一个问题。登录实际上就是ASP根据Flash提供的数据查询数据库的过程&#xff0c;而注册则是ASP将Flash提供的数据写入数据库的过程。 1.启动Access2003&…

linux 查找文件或查找内容 (find grep)

一 linux 查找包含指定内容的文件&#xff1a; 在linux 有时我们只我知道内容但不知道文件在哪&#xff0c;可以使用find 与grep查找 例1 要查找指定目录&#xff08;默认包含子目录&#xff09;文件内容包含 xxx 的文件 find /etc/ -type f -exec grep -l "mysql"…

音频格式之AAC:(2)AAC封装格式ADIF,ADTS,LATM,extradata及AAC ES存储格式

系列文章目录 音频格式的介绍文章系列&#xff1a; 音频编解码格式介绍(1) ADPCM&#xff1a;adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#xff1a;(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#x…

第14章_数据结构与集合源码(一维数组,链表,栈,队列,树与二叉树,List接口分析,Map接口分析,Set接口分析,HashMap的相关问题)

文章目录 第14章_数据结构与集合源码本章专题与脉络1. 数据结构剖析1.1 研究对象一&#xff1a;数据间逻辑关系1.2 研究对象二&#xff1a;数据的存储结构&#xff08;或物理结构&#xff09;1.3 研究对象三&#xff1a;运算结构1.4 小结 2. 一维数组2.1 数组的特点2.2 自定义数…

Linux——系统简介

1、从UNIX到LINUX 在目前主流的服务器端操作系统中&#xff0c;UNIX诞生于20世纪60年代末&#xff0c;Windows诞生于20世纪80年代中期&#xff0c;Linux诞生于20世纪90年代初&#xff0c;可以说UNIX是操作系统中的“老大哥”。 1.1、Linux简史 Linux内核最初是由李纳斯托瓦兹…

Chrony时间同步程序

Chrony简介 学习chrony之前首先要来看看chrony到底是干什么用的&#xff1a; chrony是网络时间协议 &#xff08;NTP&#xff09; 的通用实现。 它可以将系统时钟与 NTP 服务器、参考时钟同步 &#xff08;例如 GPS 接收器&#xff09;&#xff0c;以及使用手表和键盘手动输入…

vue3---inputRef.value.focus()报错Cannot read properties of null (reading ‘focus‘)

问题描述&#xff1a;点击编辑按钮&#xff0c;出现el-input框&#xff08;el-input显示隐藏通过v-if控制&#xff09; <el-input ref"inputRef" v-if"isEdit" v-model"modelName" blur"isEdit false" /> <el-button text …

机器学习_常见算法比较模型效果(LR、KNN、SVM、NB、DT、RF、XGB、LGB、CAT)

文章目录 KNNSVM朴素贝叶斯决策树随机森林 KNN “近朱者赤&#xff0c;近墨者黑”可以说是 KNN 的工作原理。 整个计算过程分为三步&#xff1a; 计算待分类物体与其他物体之间的距离&#xff1b;统计距离最近的 K 个邻居&#xff1b;对于 K 个最近的邻居&#xff0c;它们属于…

【Maven教程】(十五):编写 Maven 插件—— 编写 Maven 插件的一般步骤及案例、Mojo 标注与参数、错误处理和日志 ~

Maven 编写 Maven 插件 1️⃣ 编写 Maven 插件的一般步骤2️⃣ 案例&#xff1a;编写一个用于代码行统计的 Maven 插件3️⃣ Mojo 标注4️⃣ Mojo 参数5️⃣ 错误处理和日志6️⃣ 测试 Maven 插件&#x1f33e; 总结 前面文章已经讲过&#xff0c;Maven 的任何行为都是由插件完…

[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

如何使用Flutter构建高质量的用户界面

Flutter 是一种比较流行的移动应用开发框架&#xff0c;可以让开发者使用一个代码库构建高质量的 iOS 和 Android 应用。Flutter 以其快速、美观、高度可定制等优点吸引了开发社区的广泛关注。但如何使用 Flutter 构建高质量的用户界面呢&#xff1f;下面分为以下几个部分简单的…

聚醚醚酮(Polyether Ether Ketone)PEEK主要作用是什么?

聚醚醚酮&#xff08;Polyether Ether Ketone&#xff0c;PEEK&#xff09;在工程和高性能应用中具有广泛的应用&#xff0c;主要作用包括&#xff1a; 1.结构材料&#xff1a; PEEK因其优异的机械性能&#xff0c;包括高强度、高硬度和耐磨性&#xff0c;常被用作结构件的制造…

企业能源消耗监测管理系统是否可以做好能源计量与能耗分析?

能源消耗与分析是能源科学管理的基础&#xff0c;也可促进能源管理工作的改善&#xff0c;在企业中能源管理系统的作用也愈加重要。 首先&#xff0c;能源计量是能源管理的基础&#xff0c;通过能源精准计老化&#xff0c;容易出现测量设备不准确以及其他一些人为因素原因导致…

蓝凌OA sysUiExtend.do 任意文件上传漏洞复现

0x01 产品简介 蓝凌核心产品EKP平台定位为新一代数字化生态OA平台,数字化向纵深发展,正加速构建产业互联网,对企业协作能力提出更高要求,蓝凌新一代生态型OA平台能够支撑办公数字化、管理智能化、应用平台化、组织生态化,赋能大中型组织更高效的内外协作与管理,支撑商业…

编译PCL Qt程序

使用PCL的qt程序时&#xff0c;提示不是用QVTK编译的&#xff0c;所以需要在编译VTK时打开Qt的编译选项&#xff08;由于CMakeList比较复杂&#xff0c;使用CMakeGui进行配置&#xff0c;PCL同理&#xff09;&#xff0c;编译VTK完成后&#xff0c;编译PCL也需要配置Qt支持&…

【VTKExamples::PolyData】第十九期 ImplicitDataSetClipping

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ImplicitDataSetClipping,并解析接口vtkIdFilter & vtkBox & vtkClipPolyData,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就…

Pandas ------ 向 Excel 文件中写入含有合并表头的数据

Pandas ------ 向 Excel 文件中写入含有合并表头的数据 推荐阅读引言正文 推荐阅读 Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言 这里给大家介绍一下如何向 Excel 中写入带有合并表头的数据。 正文 import pandas as pddf1 pd.D…

flutter设置windows是否显示标题栏和状态栏和全屏显示

想要让桌面软件实现全屏和不显示状态栏或者自定义状态栏&#xff0c;就可以使用window_manager这个依赖库&#xff0c;使用起来还是非常方便的&#xff0c;可以自定义显示窗口大小和位置&#xff0c;还有设置标题栏是否展示等内容&#xff0c;也可以设置可拖动区域。官方仓库地…

C语言实现希尔排序算法(附带源代码)

希尔排序 希尔排序&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的&#xff1a; 插入排序在对几乎已经排好序的数据操作时&#xff0c;效率高&#xff0…