【数据结构 — 排序 — 选择排序】

数据结构 — 排序 — 选择排序

  • 一.选择排序
    • 1.基本思想
    • 2.直接选择排序
      • 2.1算法讲解
      • 2.2.代码实现
        • 2.2.1.函数定义
        • 2.2.2.算法接口实现
        • 2.2.3.测试代码实现
        • 2.2.4.测试展示
    • 3.堆排序
      • 3.1.算法讲解
      • 3.2.代码实现
        • 3.2.1.函数定义
        • 3.2.2.算法接口实现
        • 3.2.3.测试代码实现
        • 3.2.4.测试展示

一.选择排序

1.基本思想

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

2.直接选择排序

2.1算法讲解

• 在元素集合array[i]–array[n-1]中选择关键码最大(小)的数据元素
• 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
• 在剩余的array[i]–array[n-2](array[i+1]–array[n-1])集合中,重复上述步骤,直到集合剩余1个元素

在这里插入图片描述

直接选择排序的特性总结:

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

2.2.代码实现

2.2.1.函数定义
Sort.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<string.h>
#include<time.h>//打印
void PrintArray(int* a, int n);
//选择排序
void SelectSort(int* a, int n);
2.2.2.算法接口实现
Sort.c
#include"Sort.h"void PrintArray(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}//选择排序
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){int mini = begin, maxi = begin;for (int i = begin; i <= end; i++){if (a[i] > a[maxi])maxi = i;if (a[i] < a[mini])mini = i;}Swap(&a[begin], &a[mini]);if (begin == maxi)maxi = mini;Swap(&a[end], &a[maxi]);begin++;--end;}
}
2.2.3.测试代码实现
test.c
#include"Sort.h"void TestSelectSort()
{int a[] = { 2,4,5,7,8,0,9,6,3,1 };printf("排序前:");PrintArray(a, sizeof(a) / sizeof(int));printf("\n");printf("选择排序:");SelectSort(a, sizeof(a) / sizeof(int));PrintArray(a, sizeof(a) / sizeof(int));
}int main()
{TestSelectSort();return 0;
2.2.4.测试展示

在这里插入图片描述

3.堆排序

3.1.算法讲解

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆

如果想要更详细的了解堆排序,可以前往我之前的博客数据结构 —— 堆的实现(顺序表)(点击即可跳转),了解更多实现详情,以下这里,只是简单讲解展示堆排序的实现代码。

在这里插入图片描述

3.2.代码实现

3.2.1.函数定义
Sort.h
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<string.h>
#include<time.h>//打印
void PrintArray(int* a, int n);
//堆排序
void HeapSort(int* a, int n);
3.2.2.算法接口实现
Sort.c
#include"Sort.c"void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}//向下调整建堆
void AdJustDown(int* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child + 1] > a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}
//堆排序
void HeapSort(int* a, int n)
{int end = n - 1;for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdJustDown(a,n, i);}while(end > 0){Swap(&a[0], &a[end]);AdJustDown(a, end, 0);end--;}
}
3.2.3.测试代码实现
test.c
#include"Sort.c"void TestHeapSort()
{int a[] = { 2,4,5,7,8,0,9,6,3,1 };printf("排序前:");PrintArray(a, sizeof(a) / sizeof(int));printf("\n");printf("堆排序:");HeapSort(a, sizeof(a) / sizeof(int));PrintArray(a, sizeof(a) / sizeof(int));
}
int main()
{TestHeapSort();return 0;
}
3.2.4.测试展示

在这里插入图片描述

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

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

相关文章

笔记69:Conv1d 和 Conv2d 之间的区别

笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\4. Transformer 网络变体 a a a a a a a a a a a

二百一十、Hive——Flume采集的JSON数据文件写入Hive的ODS层表后字段的数据残缺

一、目的 在用Flume把Kafka的数据采集写入Hive的ODS层表的HDFS文件路径后&#xff0c;发现HDFS文件中没问题&#xff0c;但是ODS层表中字段的数据却有问题&#xff0c;字段中的JSON数据不全 二、Hive处理JSON数据方式 &#xff08;一&#xff09;将Flume采集Kafka的JSON数据…

Java IO流(五)(字符集基础知识简介)

字符集 计算机的存储规则&#xff08;英文字符&#xff09; 常见字符集介绍 a.GB2312字符集&#xff1a;1980年发布&#xff0c;1981年5月1日实施的简体中文汉字编码国家标准。收录7445个图形字符&#xff0c;其中包括6763个简体汉字 b.BIG5字符集&#xff1a;台湾地区繁体中…

小黑子——springBoot基础

springBoot简单学习 一、SpringBoot简介1.1 springBoot快速入门1.1.1 开发步骤1.1.2 对比1.1.3 官网构建工程1.1.3 SpringBoot工程快速启动 1.2 springBoot概述1.2.1 起步依赖I. 探索父工程II. 探索依赖III. 小结 1.2.2 程序启动1.2.3 切换web服务器-jetty 二、配置文件2.1 配置…

(2022|ICLR,kNN检索,扩散,仅图像训练)KNN-Diffusion:通过大规模检索生成图像

KNN-Diffusion: Image Generation via Large-Scale Retrieval 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 仅文本图像处理 4. 实验 …

计算机毕业设计JAVA+SSM+springboot养老院管理系统

设计了养老院管理系统&#xff0c;该系统包括管理员&#xff0c;医护人员和老人三部分。同时还能为用户提供一个方便实用的养老院管理系统&#xff0c;管理员在使用本系统时&#xff0c;可以通过系统管理员界面管理用户的信息&#xff0c;也可以进行个人中心&#xff0c;医护等…

错题总结(四)

1.【一维数组】输入10个整数&#xff0c;求平均值 编写一个程序&#xff0c;从用户输入中读取10个整数并存储在一个数组中。然后&#xff0c;计算并输出这些整数的平均值。 int main() {int arr[10];int sum 0;for (int n 0; n < 10; n){scanf("%d", &arr…

Git merge 与 Git rebase 与 Git fetch

Git merge 与 Git rebase 看这个图就行了 git merge、git rebase 和 git fetch 是 Git 中的三个不同的命令&#xff0c;它们分别用于不同的目的。以下是它们的主要区别&#xff1a; git merge&#xff08;合并&#xff09;&#xff1a; 用途&#xff1a; 用于将一个分支的更改…

dToF直方图之美_激光雷达多目标检测

直方图提供了一种简单有效的方法来分析信号分布并识别与目标存在相对应的峰值,并且能够可视化大量数据,让测距数形结合。在车载激光雷达中,对于多目标检测,多峰算法统计等,有着区别于摄像头以及其他雷达方案的天然优势。 如下图,当中有着清晰可见的三个峰值,我们可以非…

8利用路由器实现VLAN间路由

在第五节里聊过虚拟局域网构建&#xff0c;不同的虚拟局域网不能通信。但有时候&#xff0c;想让不同的虚拟局域网之间能够通信&#xff0c;需要怎么做&#xff1f; 主要有以下三种方式&#xff1a; 如果使用传统VLAN间路由&#xff0c;缺点比较多&#xff0c;后面有机会的话也…

什么是Linux权限

Linux权限 文章目录 Linux权限一、root账号与普通账号二、Linux权限管理三、权限权值表示方法四、文件访问权限的设置方法五、粘滞位六、权限总结 前言&#xff1a; 我们在学习Linux的时候&#xff0c;我们知道在Linux下一切皆文件&#xff0c;而不同的文件对于不同的用户有不同…

【杂项】程序的执行目录和程序的当前目录

当32位应用程序运行时&#xff0c;系统将为它分配一个4GB的地址空间&#xff0c;加载模块会会分析该应用程序的输入信息&#xff0c;从中找到程序将要访问的动态链接库信息&#xff0c;在用户机器上搜索这些动态链接库&#xff0c;进而加载它们&#xff0c;搜索的顺序依次是 程…