每日回顾:简单用C写 选择排序、堆排序

news/2024/10/19 7:32:29/

选择排序

直接选择排序(Selection Sort)是一种简单的排序算法。它的基本思想是每次从未排序的部分中选择最小(或最大)的元素,将其放到已排序部分的末尾。

版本一:

//直接选择排序1
void SelectSort_1(int* a, int n) {for (int j = n; j > 1; j--) {	//逐渐缩小未排序范围,剩一个元素时不用再进循环int max = 0;for (int i = 1; i < j; i++) {if (a[i] > a[max]) {max = i;}}//找到最大的元素,交换到末尾int tmp = a[j - 1];a[j - 1] = a[max];a[max] = tmp;}
}

版本二:

//直接选择排序2
void SelectSort_2(int* a, int n) {int left = 0;int right = n - 1;while (left < right) {int maxi = left;int mini = right;for (int i = left; i <= right; i++) {	//每次循环,找出一个最大一个最小值if (a[i] < a[mini]) {mini = i;}else if(a[i] > a[maxi]) {maxi = i;}}//最大最小值分别与首尾交换,左右下标指针向中间收缩int tmp = a[left];a[left] = a[mini];a[mini] = tmp;//可能会出现 mini/maxi 在 left/right 位置上//交换一次后,mini/maxi 的位置会改变//修正if (maxi == left) {maxi = mini;}tmp = a[right];a[right] = a[maxi];a[maxi] = tmp;left++;right--;}
}

版本区别

版本二从首尾开始,向中间收缩;消耗的时间减少一半,虽然并没什么用......

时间复杂度

两个循环嵌套,O(n^2)

空间复杂度

原地修改,O(1)

稳定性

存在元素的交换,不稳定

堆排序

堆排序(Heap Sort)是一种基于选择 or 比较的排序算法,它利用了二叉堆数据结构。堆排序分为两个主要的步骤:构建大堆(或小堆)和执行排序。

大致思想:

先建堆、如果升序,就建大堆;

接着对大堆执行排序:首尾元素交换(此时尾元素最大)、将尾元素视作堆之外的元素,将刚刚的首元素向下调整以保证大堆性质;

之后重复上一步操作,即可

//向下调整
void AdjustDown(int* a, int n, int parent) {int child = parent * 2 + 1;	//左孩子while (child < n) {//找出较大的孩子、和父节点对比-->是否需要交换if (child < n - 1 && a[child] < a[child + 1]) {child++;}if (a[child] > a[parent]) {	//建立大堆int tmp = a[child];a[child] = a[parent];a[parent] = tmp;parent = child;child = parent * 2 + 1;}else {break;}}
}
//堆排序
void HeapSort(int* a, int n) {//循环来调整每个子树、以建立大堆for (int i = (n - 1 - 1) / 2; i >= 0; i--) {	//(n-1-1)/2 为最后一个节点的父节点,因为 n-1 是数组最后一个下标AdjustDown(a, n, i);}//对大堆进行操作,以完成升序for (int i = n - 1; i > 0; i--) {//首尾交换int tmp = a[0];a[0] = a[i];a[i] = tmp;//首元素向下调整AdjustDown(a, i, 0);}//此时数组已为升序
}

时间复杂度

堆排序的时间复杂度取决于建堆时的调整次数O(n*logn)、执行排序时每次取出一个元素然后调堆O(n*logn),所以总体为O(n*logn)

空间复杂度

原地修改,O(1)

稳定性

堆排序依赖于堆的性质和排序过程中的交换操作,不稳定


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

相关文章

WT2003H语音芯片MCU下载方案助力电动车智能化升级:实现多功能语音提示+报警功能

一&#xff1a;产品市场 随着科技的发展&#xff0c;电瓶车在技术革新上也在不断进步&#xff0c;如今许多厂家&#xff0c;都会加入语音提示功能&#xff0c;能在倒车、喇叭、故障时发出语音报警&#xff0c;提示骑行者电量不足、倒车请注意、故障语音提示等&#xff1b;唯创…

022 elasticsearch文档管理(添加、修改、删除、批处理)

文章目录 添加文档修改文档删除文档根据_id取文档使用批处理_bulk PortX&#xff1a; https://portx.online/zh MobaXterm&#xff1a; https://mobaxterm.mobatek.net/ FinalShell&#xff1a; http://www.hostbuf.com/ 添加文档 向索引中添加一行数据 使用json来表示 使用…

CVTE Android面试题及参考答案

Activity 的生命周期 Activity 的生命周期分为以下几个主要状态: onCreate ():在 Activity 第一次被创建的时候调用。通常在这个方法中进行一些初始化操作,如设置布局、初始化成员变量等。这是 Activity 进入可见状态的第一步。onStart ():当 Activity 即将对用户可见的时候…

【RV1126】板子adb 调试流程

1. 连接电源线&#xff0c;网线 2. 打开终端 adb connect 192.168.2.99 3.进入设备 adb shell 4.开始推流 cd /oem/usr/bin ./rkmedia_vi_venc_rtsp_test -a /etc/iqfiles/ -I 0 -I 0 选择的摄像头序号&#xff0c;可以选择0或1 5.查看相机参数 v4l2-ctl --device/de…

C++ OpenCV实现简单的自瞄脚本(OpenCV实战)

练枪的时候发现打的靶子特征很醒目&#xff0c;而且操控的逻辑也不是说特别难&#xff0c;刚好会一点点C和OpenCV&#xff0c;为什么不试试写一个小程序来帮助我们瞄准呢&#xff1f; 实现效果 我们主要是通过这款游戏测试自瞄 简单的调参之后本周世界排名也是打到了第一名&…

反向传播和优化 pytorch

**前置知识&#xff1a; 优化器&#xff1a;optimtorch.optim.SGD(xigua1.parameters(),lr0.01) 传入模型的参数、学习速率 计算损失&#xff1a;result_lossloss(outputs,targets) 梯度清零&#xff1a;optim.zero_grad() 计算梯度并反向传播&#xff1a;result_loss.backward…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

刷题 排序算法

912. 排序数组 注意这道题目所有 O(n^2) 复杂度的算法都会超过时间限制&#xff0c;只有 O(nlogn) 的可以通过 快速排序空间复杂度为 O(logn)是由于递归的栈的调用归并排序空间复杂度为 O(n) 是由于需要一个临时数组 (当然也需要栈的调用&#xff0c;但是 O(logn) < O(n) 的…