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

目录

一、实验目的

二、实验原理

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.mzph.cn/news/648037.shtml

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

相关文章

深入了解 Spring BeanPostProcessor 的应用

Spring框架的强大之处在于其提供了丰富的扩展点&#xff0c;其中之一是BeanPostProcessor接口。这个接口允许我们在Spring容器实例化bean之后、在调用初始化方法之前和之后对bean进行一些自定义的处理。在这篇文章中&#xff0c;我们将深入研究BeanPostProcessor的使用场景&…

Vue3基础:pnpm是什么?npm和pnpm的区别?如何使用pnpm?

pnpm 是一个流行的 JavaScript 包管理器&#xff0c;类似于 npm 和 yarn。它是 performant npm 的缩写&#xff0c;意在表明它是一个更高效的 npm 替代品。pnpm 的主要特点和优势包括&#xff1a; 高效的存储空间使用 pnpm 使用称为“内容寻址存储”的机制来存储 npm 包。这意…

如何选择便捷安全的黄金交易平台?

黄金交易平台的介绍 黄金交易平台是一个提供方便、安全的方式进行黄金交易的网上平台。 投资者可以通过这些平台进行黄金的买卖&#xff0c;参与黄金市场的投资活动。 这些平台提供了一个简单易用的界面&#xff0c;让投资者可以方便地进行交易操作。 选择合适的黄金交易平台…

【运维】Ubuntu,如何在Ubuntu系统中编译和安装OpenCV, apt安装OpenCV

文章目录 编译安装apt安装OpenCV 在C开发中&#xff0c;使用OpenCV是一个常见的需求。您可以选择使用conan构建包&#xff0c;或者直接将OpenCV安装到系统中。官方文档提供了详细的教程&#xff0c;可以在这里找到&#xff1a;OpenCV官方文档 编译安装 然而&#xff0c;在这里…

小土堆pytorch学习笔记002

1、TensorBoard的使用 &#xff08;1&#xff09;显示坐标&#xff1a; from torch.utils.tensorboard import SummaryWriter import numpy as np from PIL import Imagewriter SummaryWriter("logs") # 写入的位置 log_dir logs # writer.add_image() "…

【LeetCode: 148. 排序链表 + 链表 + 归并排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

今天来看看工商业储能收益模式有哪些

安科瑞武陈燕acrelcy 2023 年有望成为工商业储能的发展元年&#xff0c;主要原因2023年工商业储能的经济性有望大幅提升。工商业储能下游主要为工商业企业&#xff0c;投资是否具有经济性是工商业需求的核心因素之一&#xff0c;而2023年工商业储能经济性或将显著提升&#xf…

shared_ptr 与 unique_ptr 的转换 笔记

推荐B站文章&#xff1a; 6.shared_ptr与unique_ptr_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p6&vd_sourcea934d7fc6f47698a29dac90a922ba5a3我的往期文章&#xff1a; 独占指针&#xff1a;unique_ptr 与 函数调用-CSDN博客https://blog.csdn.n…

【Docker】构建镜像

一般来说我们不需要自己构建镜像&#xff0c;这些镜像在docker hub上面已经有现成的了&#xff0c;比如常用的数据库、应用软件等。 某些情况我们还是需要自己来构建: 找不到现成的镜像&#xff0c;比如自己开发的应用程序 需要在镜像中加入特定的功能/软件 Docker提供了两种…

C++入门学习(十五)运算符

算术运算符&#xff1a;用于处理四则运算赋值运算符&#xff1a;用于将表达式的值赋给变量比较运算符&#xff1a;用于表达式的比较&#xff0c;并返回一个真值或假值逻辑运算符&#xff1a;用于根据表达式的值返回真值或假值 一、加减乘除 #include <iostream> #incl…

vue和react的运行机制

Vue和React都是现代的前端框架&#xff0c;它们提供了丰富的特性和工具&#xff0c;帮助开发者构建复杂的用户界面。虽然它们有很多相似之处&#xff0c;但也有一些重要的区别&#xff0c;特别是在运行机制方面。 Vue的运行机制 Vue.js是一个渐进式JavaScript框架&#xff0c…

Ubuntu20.04 安装 ROS noetic + MAVROS

本文在 AlphaCatOvO【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程 基础上&#xff0c;根据实际安装经验&#xff0c;稍微进行补充。 一、安装Ubuntu20.04 假设已经正确安装。 二、安装 ROS noetic 2.1 换源 执行 sudo apt update sudo mv /etc/apt/sources.list /etc/apt/…

ijkj4a作用

ijkj4a是一个用于在Android平台上与Java和JNI进行交互的库。它提供了一些方便的函数和宏&#xff0c;用于在JNI层面上访问Java类和方法。通过使用ijkj4a&#xff0c;开发人员可以更轻松地在JNI代码中调用Java方法&#xff0c;以及在Java代码中调用JNI函数。 ijkj4a的作用主要有…

A股市场风云!深圳开股票账户交易佣金费用最低是多少?

最近A股市场表现出色&#xff0c;呈现出风云状态&#xff01;投资者纷纷涌入股市&#xff0c;推动股指不断攀升。一方面&#xff0c;政府出台了一系列政策来稳定市场&#xff0c;如加强监管力度、推动资本市场改革等&#xff0c;为投资者提供了更多机会和便利条件。另一方面&am…

“情暖寒冬 温暖相伴”关爱慰问

岁末寒冬&#xff0c;春节将至&#xff0c;为持续巩固脱贫攻坚成果&#xff0c;扎实助力乡村振兴&#xff0c;市融媒体中心开展“情暖寒冬 温暖相伴”慰问活动。 1月25市融媒体中心联合我市志愿者协会在南村镇忽树庄村开展“情暖寒冬 温暖相伴”慰问活动&#xff0c;为脱贫户送…

Spark3学习笔记

文章目录 一、Spark 基础1、Spark概述1.1 Spark简介1.2 Spark VS Hadoop1.3 Spark特点1.4 Spark入门Demo 2、Spark 运行模式2.1 概述2.2 Local模式2.3 Standalone 模式2.4 配置高可用&#xff08; Standalone HA&#xff09;2.5 Yarn 模式2.6 K8S & Mesos 模式2.7 Windows …

Vue基础知识

Vue Vue基础知识 v-bind:动态绑定属性值 Vue 修改&#xff0c;标签内也修改 在methods 中可以定义很多函数 在 data 中可以定义很多变量 v-if / v-show&#xff1a;对符合条件的元素进行展示 v-for:把数据遍历出现在网页中 案例 <!DOCTYPE html><html lang"e…

postman自动化测试如何设置环境变量教程

在接口测试中&#xff0c;我们经常会用到一些通用请求参数&#xff0c;或者需要使用某个接口的返回参数作为另一个接口的请求参数&#xff0c;静态的参数还好&#xff0c;如果是经常变动的参数&#xff0c;那么操作起来&#xff0c;就特别的麻烦&#xff0c;这时候&#xff0c;…

C语言用户态函数可观测性

本文不是介绍eBPF相关的用户态Probe的内容&#xff0c;而是如何利用开源C语言库Melon的函数模板来轻松实现函数的可观测性需求&#xff0c;例如&#xff1a;测量耗时等。 本文主要介绍的是Melon库中的func模块&#xff0c;之所以没有给这个模块起名叫可观测性或者span&#xf…

springboot(ssm成都旅游网 旅游管理系统 旅游规划系统Java系统

springboot(ssm成都旅游网 旅游管理系统 旅游规划系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.…