数据结构实验报告-排序

news2024/9/30 0:28:45

     

一、实验名称

实验8 排序

二、实验内容:

分别采用直接插人排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序等排序算法对简单的整型数组进行排序,并输出排序结果。

源码:
#include <iostream>

#include <vector>

using namespace std;

// 直接插入排序

void insertionSort(vector<int>& arr) {

    int n = arr.size();

    for (int i = 1; i < n; i++) {

        int key = arr[i];

        int j = i - 1;

        while (j >= 0 && arr[j] > key) {

            arr[j + 1] = arr[j];

            j--;

        }

        arr[j + 1] = key;

    }

}

// 希尔排序

void shellSort(vector<int>& arr) {

    int n = arr.size();

    for (int gap = n / 2; gap > 0; gap /= 2) {

        for (int i = gap; i < n; i++) {

            int temp = arr[i];

            int j = i;

            while (j >= gap && arr[j - gap] > temp) {

                arr[j] = arr[j - gap];

                j -= gap;

            }

            arr[j] = temp;

        }

    }

}

// 冒泡排序

void bubbleSort(vector<int>& arr) {

    int n = arr.size();

    for (int i = 0; i < n - 1; i++) {

        for (int j = 0; j < n - i - 1; j++) {

            if (arr[j] > arr[j + 1]) {

                swap(arr[j], arr[j + 1]);

            }

        }

    }

}

// 快速排序

void quickSort(vector<int>& arr, int low, int high) {

    if (low < high) {

        int pivot = arr[low];

        int i = low, j = high;

        while (i < j) {

            while (i < j && arr[j] >= pivot) j--;

            arr[i] = arr[j];

            while (i < j && arr[i] <= pivot) i++;

            arr[j] = arr[i];

        }

        arr[i] = pivot;

        quickSort(arr, low, i - 1);

        quickSort(arr, i + 1, high);

    }

}

// 简单选择排序

void selectionSort(vector<int>& arr) {

    int n = arr.size();

    for (int i = 0; i < n - 1; i++) {

        int min_idx = i;

        for (int j = i + 1; j < n; j++) {

            if (arr[j] < arr[min_idx]) {

                min_idx = j;

            }

        }

        swap(arr[i], arr[min_idx]);

    }

}

// 堆排序

void heapify(vector<int>& arr, int n, int i) {

    int largest = i;

    int left = 2 * i + 1;

    int right = 2 * i + 2;

    if (left < n && arr[left] > arr[largest]) {

        largest = left;

    }

    if (right < n && arr[right] > arr[largest]) {

        largest = right;

    }

    if (largest != i) {

        swap(arr[i], arr[largest]);

        heapify(arr, n, largest);

    }

}

void heapSort(vector<int>& arr) {

    int n = arr.size();

    for (int i = n / 2 - 1; i >= 0; i--) {

        heapify(arr, n, i);

    }

    for (int i = n - 1; i >= 0; i--) {

        swap(arr[0], arr[i]);

        heapify(arr, i, 0);

    }

}

// 归并排序

void merge(vector<int>& arr, int l, int m, int r) {

    int n1 = m - l + 1;

    int n2 = r - m;

    vector<int> L(n1), R(n2);

    for (int i = 0; i < n1; i++) {

        L[i] = arr[l + i];

    }

    for (int j = 0; j < n2; j++) {

        R[j] = arr[m + 1 + j];

    }

    int i = 0, j = 0, k = l;

    while (i < n1 && j < n2) {

        if (L[i] <= R[j]) {

            arr[k] = L[i];

            i++;

        }

        else {

            arr[k] = R[j];

            j++;

        }

        k++;

    }

    while (i < n1) {

        arr[k] = L[i];

        i++;

        k++;

    }

    while (j < n2) {

        arr[k] = R[j];

        j++;

        k++;

    }

}

void mergeSort(vector<int>& arr, int l, int r) {

    if (l < r) {

        int m = l + (r - l) / 2;

        mergeSort(arr, l, m);

        mergeSort(arr, m + 1, r);

        merge(arr, l, m, r);

    }

}

int main() {

    vector<int> arr = { 64, 25, 12, 22, 11 };

    cout << "原始数组:";

    for (int num : arr) {

        cout << num << " ";

    }

    // 调用各种排序算法

    insertionSort(arr);

    // shellSort(arr);

    // bubbleSort(arr);

    // quickSort(arr, 0, arr.size() - 1);

    // selectionSort(arr);

    // heapSort(arr);

    // mergeSort(arr, 0, arr.size() - 1);

    cout << "\n排序结果:";

    for (int num : arr) {

        cout << num << " ";

    }

    cout << endl;

    return 0;

}

理论篇的代码都是以整型数组作为测试数据,这样既简单又能够表达算法流程,但在实际应用中往往面临更复杂的数据类型。假设有一个存放学生姓名信息的字符串数组,实验要求对这些姓名信息利用多种排序方法的相关算法进行排序。

提示:

(1)对姓名按照汉字的汉语拼音排序,比如“张三”(ZhangSan)和“李四”(LiSi)。从首字母按照a-z的字母顺序比较,比较时可以不分大小写,首字母相同,则继续比较后续字母。

(2)对于“张三”和“张三丰”这种情况,名字短的排在前面。

源码:
#include <iostream>

#include <vector>

#include <algorithm>

#include <cstring>

using namespace std;

// 汉语拼音排序比较函数

bool cmpPinyin(const string& a, const string& b) {

    return _stricmp(a.c_str(), b.c_str()) < 0;

}

// 长度排序比较函数

bool cmpLength(const string& a, const string& b) {

    if (a.length() == b.length()) {

        return cmpPinyin(a, b);

    }

    return a.length() < b.length();

}

int main() {

    vector<string> names = { "ZhangSan", "LiSi", "ZhangSanFeng", "WangWu", "ZhaoLiu", "ChenQi" };

    cout << "原始姓名信息:";

    for (const string& name : names) {

        cout << name << " ";

    }

    cout << endl;

    // 按照汉语拼音排序

    sort(names.begin(), names.end(), cmpPinyin);

    cout << "按照汉语拼音排序结果:";

    for (const string& name : names) {

        cout << name << " ";

    }

    cout << endl;

    // 按照长度排序

    sort(names.begin(), names.end(), cmpLength);

    cout << "按照长度排序结果:";

    for (const string& name : names) {

        cout << name << " ";

    }

    cout << endl;

    return 0;

}

三、心得体会:

在进行学生姓名信息排序的实验中,我深刻体会到排序算法的重要性和灵活运用的必要性。通过汉语拼音和长度两种不同的排序方法,可以让姓名信息按照不同的规则得到排序,展现了算法对数据处理的灵活性。在实际编码过程中,需要灵活运用字符串比较函数,比如 `_stricmp`,解决了在不同平台下函数调用的问题。同时,对排序算法效率和稳定性的思考也是必不可少的,避免了潜在的错误。通过这次实验,我不仅学会了如何实现排序算法,更深刻理解了算法设计的重要性,以及在实际项目中如何根据需求选择合适的算法来解决问题。这次实验不仅提升了我的编程能力,也增进了对算法原理的理解。

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

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

相关文章

分享一个简单线性dp

我们可以o(n^2)&#xff0c;枚举每一个布告&#xff0c;然后从后往前枚举i前面的位置&#xff0c;然后状态转移 void solve() {int n;cin >> n;vector<int> a(n 1);for (int i 1; i < n; i) cin >> a[i];vector<int> f(n 1, 0x3f3f3f3f);f[0] …

【分隔链表】python刷题记录

R3-双指针&#xff08;快慢指针&#xff09; 新建两个链表 一个链表记录<x的值 一个链表记录>x的值 拼接即可 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next ne…

C语言 | Leetcode C语言题解之第322题零钱兑换

题目&#xff1a; 题解&#xff1a; int coinChange(int* coins, int coinsSize, int amount) {int dp[coinsSize1][amount1];for(int i0;i<coinsSize;i){for(int j0;j<amount;j){dp[i][j]INT_MAX-1;//初始化值为INT_MAX-1&#xff0c;避免后续加一导致溢出}}for(int i0;…

Python | Leetcode Python题解之第321题拼接最大数

题目&#xff1a; 题解&#xff1a; class Solution:def maxNumber(self, nums1: List[int], nums2: List[int], k: int) -> List[int]:m, n len(nums1), len(nums2)maxSubsequence [0] * kstart, end max(0, k - n), min(k, m)for i in range(start, end 1):subsequen…

语言无界,沟通无限:2024年好用在线翻译工具推荐

随着技术的发展现在的翻译在线工具从基础词句翻译到复杂的文章翻译都不在话下。为了防止你被五花八门的工具挑花眼&#xff0c;我给你介绍几款我用过的便捷、高效、准确的翻译工具吧。 1.福晰翻译端 链接直通&#xff1a;https://www.foxitsoftware.cn/fanyi/ 这个软件支持…

Google上架:8月份政策改动,未在8月31日前回应做出改动的包体将会有下架的风险

谷歌一直以用户为中心的服务思想,政策一直在变动,未及时变动的包体又下架甚至封号的风险,如有以下情况,请及时检查包体或账号相关问题,希望能给各位开发者带来帮助。 截止提交时间 2024-08-31 支付相关要求变动公布日期改动须知更改要求垃圾应用包体与用户体验公布日期改动…

LinuxC++(9):进程

linux信号 linux信号单指给进程发送的信息。比如killall 就是杀死进程&#xff0c;其实这个描述并不准确&#xff0c;应该是给程序发送一个信号&#xff0c;让程序自我了断&#xff0c;并不是我们亲自动手。 为什么直接杀死进程不好&#xff1f; 因为直接杀死进程&#xff0…

JAVA毕业设计|ssm基于ssm的宠物医院管理系统的设计与实现vue包含文档代码讲解

收藏点赞不迷路 关注作者有好处 文末获取源码 一、系统展示 二、万字文档展示 基于ssm基于ssm的宠物医院管理系统的设计与实现vue 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMVCMyBatisVue 工具&#xff1a;IDEA/Ecilpse、Navicat、Ma…

SQL注入实例(sqli-labs/less-5)

0、初始页面 1、确定闭合字符 ?id1 and 11 ?id1 and 12 ?id1 ?id1 -- 在进行前两句传参时&#xff0c;页面没有发生任何变化&#xff0c;但是当使用单引号闭合时&#xff0c;报错了。通过报错可以确定闭合符号为单引号。 2、爆库名 ?id1 and updatexml(1,concat(0x7e,(…

腾讯HunyuanDit代码解析

注意&#xff1a;本文仅供自己记录学习过程使用。 训练 全参训练过程 输入图像用VAE编码得到输入的x_start(1,4,128,128)&#xff1b;文本的两个特征&#xff1a;bert的encoder feature(1,77,1024)和T5 的feature(1,256,2048)&#xff0c;和旋转位置编码freqs_cis_img: cos …

4.8.双向循环神经网络

双向循环神经网络 ​ 在序列模型中&#xff0c;我们总是关注之前的信息&#xff0c;并以此来对下一个输出进行预测&#xff0c;但可能未来的信息也很重要&#xff0c;比如文本序列填空&#xff1a; 我___。我___饿了。我___饿了&#xff0c;我可以吃半头猪。 ​ 我们可以分别…

数据安全复合治理与实践

数据安全复合治理与实践 关键要点理论与实践 本文探讨了数据安全复合治理模式的理论与实践&#xff0c;着重强调了在数字经济迅猛发展的背景下&#xff0c;数据安全的重要性以及面对数据安全挑战时所需采取的综合治理策略。首先&#xff0c;文章概述了数据安全治理的必要性&…

使用GPT-4o mini融合GraphRAG技术进行实战应用

什么是gpt-4o mini OpenAI 推出 GPT-4o mini&#xff0c;这是他们最具成本效益的小型模型。它的定价为每百万输入代币 15 美分&#xff0c;每百万输出代币 60 美分&#xff0c;比之前的 Frontier 型号便宜一个数量级&#xff0c;比 GPT-3.5 Turbo 便宜 60% 以上。目前&#xf…

Java 并发编程:一文了解 synchronized 的使用

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 027 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

练题模块环境搭建

文章目录 1.数据库表设计1.practice_set 套卷2.practice_set_detail 套卷细节3.practice_info 练习信息4.practice_detail 练习详情5.E-R图 2.架构设计&#xff08;三层架构&#xff09;3.练题微服务架构搭建1.创建一个练题微服务模块1.创建一个maven项目2.把src删除&#xff0…

类中特殊变量的初始化

在C的类中有一些变量的初始化需要进行特殊化的处理&#xff0c;这里我将列举出常见的两种特殊类型的变量初始化。 目录 const 类型数据的初始化 代码实例&#xff1a; static类型数据的初始化 代码实例&#xff1a; const 类型数据的初始化 对于const修饰的数据我们需要在…

Robot Operating System——单线程中启动多个Node

在《Robot Operating System——Service的同步/异步通信》一文中&#xff0c;我们介绍了如何实现Service的客户端和服务端。在例子中&#xff0c;它们分别被编译成libadd_two_ints_client_async_library.so和libadd_two_ints_server_library.so&#xff0c;然后分别被可执行程序…

C:将代码拆分放在多个文件的操作

目录 前言&#xff1a; 1、多个文件 2、将一个程序分为多个文件的好处 3、一定程度上对代码进行隐藏 结语&#xff1a; 前言&#xff1a; 在我们刚开始学习C语言时&#xff0c;编写的代码通常比较简短&#xff0c;因此将其放在一个文件中并不会带来不便。然而&#xff0c;…

17965 幸运之星(优先做)

这个问题可以通过使用递归或者迭代的方法来解决。我们可以使用一个一维数组dp来存储中间结果&#xff0c;dp[i]表示i个人时的“幸运之星”的初始编号。 以下是使用C的代码实现&#xff1a; #include <iostream> using namespace std;const int MAXN 1000000; int dp[M…

力扣:100379. 新增道路查询后的最短距离 I(Java,BFS)

目录 题目描述&#xff1a;示例 &#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < …