排序 “贰” 之选择排序

news/2024/9/23 0:31:21/


目录

​编辑

1. 选择排序基本思想

2. 直接选择排序

2.1 实现步骤

2.2 代码示例

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

3. 堆排序

3.1 实现步骤

3.2 代码示例

3.3 堆排序的特性总结


1. 选择排序基本思想

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

2. 直接选择排序

2.1 实现步骤

1.从待排序序列中选择最小(或最大)的元素,将其与序列中的第一个元素交换位置。

2.在剩余的未排序序列中选择最小(或最大)的元素,将其与序列中的第二个元素交换位置。

3.重复上述步骤,每次在剩余未排序序列中选择最小(或最大)的元素,放到已排序部分的末尾,直到所有元素都被排序。

2.2 代码示例

//交换
void Swap(int* p, int* q)
{int tmp = *p;*p = *q;*q = 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 + 1; i <= end; i++){if (a[i] < a[mini]){mini = i;}if (a[i] > a[maxi]){maxi = i;}}//将找到的最小元素与未排序部分的第一个元素交换位置Swap(&a[begin], &a[mini]);//如果最大元素的下标和begin位置重复了,就更新最大元素的下标if (maxi == begin){maxi = mini;}//将找到的最大元素与未排序部分的最后一个元素交换位置Swap(&a[end], &a[maxi]);++begin;--end;}
}//打印
void PrintSort(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}//测试
int main()
{int a[] = { 13, 5, 7, 19, 0, 12, 4, 8, 8, 16 };SelectSort(a, sizeof(a) / sizeof(int));PrintSort(a, sizeof(a) / sizeof(int));return 0;
}

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

1. 直接选择排序思考非常好理解,但是效率不是很好。因此,选择排序通常不适用于大规模数据集,但在少量元素的情况下可能是一种不错的选择。

2. 时间复杂度:选择排序每次从未排序部分选择最小(或最大)的元素放到已排序部分的末尾,因此它的时间复杂度为O(N^2),其中n是数组的大小。即使在最好的情况下,选择排序的时间复杂度也是O(N^2)。

3. 空间复杂度:O(1)

4. 稳定性:不稳定

3. 堆排序

3.1 实现步骤

堆是一种特殊的完全二叉树,分为最大堆和最小堆。需要注意的是排升序要建大堆,排降序建小堆。

基本思想:

  1. 将待排序的序列构建成一个最大堆。
  2. 从最大堆中取出堆顶元素(最大元素),将其与堆中最后一个元素交换位置,然后将剩余元素重新调整成大堆。
  3. 重复上述步骤,直到所有元素都被取出,最终得到一个有序序列。

实现步骤:

  1. 构建最大堆:从最后一个非叶子节点开始,依次向上调整使得每个节点都满足最大堆的性质。
  2. 将堆顶元素与堆中最后一个元素交换位置,然后将剩余元素重新调整成大堆。
  3. 重复上述步骤,直到所有元素都被取出,最终得到一个有序序列。

3.2 代码示例

//交换
void Swap(int* p, int* q)
{int tmp = *p;*p = *q;*q = 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)
{// O(N)// 构建大堆for (int i = (n - 1 - 1) / 2; i >= 0; --i){AdjustDown(a, n, i);}// O(N*logN)//依次取出堆顶元素,调整int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;}
}//打印
void PrintSort(int* a, int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");
}//测试
int main()
{int a[] = { 1, 5, 7, 9, 0, 2, 4, 8, 8, 6 };HeapSort(a, sizeof(a) / sizeof(int));PrintSort(a, sizeof(a) / sizeof(int));return 0;
}

3.3 堆排序的特性总结

  1. 堆排序虽然效率高,但在数据量较小的情况下可能不如其他简单的排序算法,因为构建堆的过程比较耗时。
  2. 时间复杂度:O(N*logN),其中N是待排序序列的长度。
  3. 空间复杂度:堆排序是一种原地排序算法,不需要额外的空间来存储临时数据,只需要在原数组上进行操作,所以它的空间复杂度为O(1)
  4. 稳定性:不稳定,即相同元素的相对位置在排序后可能发生变化。

http://www.ppmy.cn/news/1428644.html

相关文章

补档 -- 测试的分类(1)

最近有很多人私信我说: 灰灰你什么时候写测试分类阿, 本来我要开始肝性能测试的, 我一看, 奥, 之前摸鱼忘写了, 所以这里补档(叶问指着一边笑.jpg). 总览 标红的需要注意一下. 为什么要对软件测试进行分类? 软件测试是软件生命周期的一个重要环节, 具有较高的复杂性, 对于软…

Pytorch入门实战: 06-VGG-16算法-Pytorch实现人脸识别

第P6周&#xff1a;VGG-16算法-Pytorch实现人脸识别 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.8 编译器&#xff1a;Jupyter La…

IDEA中SVN 的使用

文章目录 前言一、svn安装二、IDEA集成SVN总结 前言 svn可以老牌的代码仓库了 说实话svn还是和git无法相比的,毕竟git有本地仓库的概念,可以很好的处理冲突,然而svn是没有本地仓库的概念的,所以只能拉取别人的代码,然后处理冲突后,才能提交代码; 由于最近的工作换成了用svn仓…

HTML:Form表单控件主要标签及属性。name属性,value属性,id属性详解。表单内容的传递流程,get和post数据传递样式。表单数据传递实例

form表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

电脑技巧:Bandicam班迪录屏介绍

目录 一、 软件简介 二、软件功能 2.1 屏幕录制 2.2 游戏录制 2.3 设备录制 2.4实时编辑与截图 2.5 轻量级软件 三、软件用途 3.1 教育培训 3.2 游戏直播与分享 3.3 企业办公 3.4 在线教学与知识分享 四、总结 今天给大家推荐一款非常实用的电脑录屏软件&#xf…

java的Spring XML和注解解析深入理解

理解 Spring XML 配置和注解的深层原理对于掌握 Spring Framework 至关重要。下面我将为你提供详细的代码介绍&#xff0c;涵盖了 Spring XML 配置和注解的使用。 1. Spring XML 配置 1.1 创建一个简单的 Java 类 package com.example.demo;public class MyService {public …

Spark-机器学习(1)什么是机器学习与MLlib算法库的认识

从这一系列开始&#xff0c;我会带着大家一起了解我们的机器学习&#xff0c;了解我们spark机器学习中的MLIib算法库&#xff0c;知道它大概的模型&#xff0c;熟悉并认识它。同时&#xff0c;本篇文章为个人spark免费专栏的系列文章&#xff0c;有兴趣的可以收藏关注一下&…

2024.04.07 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 小米SU7城市领航8月全国开通&#xff1b;特斯拉FSD开启1个月免费试用&#xff1b;智己汽车“无图城市NOA”将在4月开启公测 自动驾驶一周资讯 - 小米SU7城市领航8月…