当前位置: 首页 > news >正文

【数据结构学习笔记】选择排序

【数据结构学习笔记】选择排序

参考电子书:排序算法精讲

算法原理

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕

const nums = [1, 4, 6, 2, 0];let minIndex;
for (let i = 0; i < nums.length; i++) {minIndex = i;for (let j = i + 1; j < nums.length; j++) {if (nums[j] < nums[minIndex]) {minIndex = j;}}const temp = nums[i];nums[i] = nums[minIndex];nums[minIndex] = temp;
}
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

优化方式

  • 当 i = nums.length - 1 时,j = nums.length 直接跳出循环,因此可以跳过
const nums = [1, 4, 6, 2, 0];let minIndex;
for (let i = 0; i < nums.length - 1; i++) {minIndex = i;for (let j = i + 1; j < nums.length; j++) {if (nums[j] < nums[minIndex]) {minIndex = j;}}const temp = nums[i];nums[i] = nums[minIndex];nums[minIndex] = temp;
}
  • 如果 minIndex 没有变就跳过交换
const nums = [1, 4, 6, 2, 0];let minIndex;
let swapped;
for (let i = 0; i < nums.length; i++) {minIndex = i;swapped = false;for (let j = i + 1; j < nums.length - i; j++) {if (nums[j] < nums[minIndex]) {minIndex = j;swapped = true;}}if (!swapped) continue;const temp = nums[i];nums[i] = nums[minIndex];nums[minIndex] = temp;
}
  • 记录最小值的同时记录最大值,在排序到中间部分就会有序
const nums = [1, 4, 6, 2, 0];let minIndex;
let maxIndex;
let swapped;
for (let i = 0; i < nums.length; i++) {minIndex = i;maxIndex = i;swapped = false;for (let j = i + 1; j < nums.length - i; j++) {if (nums[j] < nums[minIndex]) {minIndex = j;swapped = true;}if (nums[j] > nums[maxIndex]) {maxIndex = j;swapped = true;}}if (!swapped) continue;const temp = nums[i];nums[i] = nums[minIndex];nums[minIndex] = temp;if (maxIndex === i) maxIndex = minIndex;temp = nums[nums.length - 1 - i];nums[nums.length - 1 - i] = nums[maxIndex];nums[maxIndex] = temp;
}

相关例题

LC 215.数组中的第 k 个最大元素

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

/*** @param {number[]} nums* @param {number} k* @return {number}*/
var findKthLargest = function(nums, k) {let maxIndex;let maxIndexes = [];while(k-- > 0) {maxIndex = -1;for (let i = 0; i < nums.length; i++) {if (maxIndexes.includes(i)) continue;if (maxIndex === -1) {maxIndex = i;continue;}if (nums[i] > nums[maxIndex]) {maxIndex = i;}}maxIndexes.push(maxIndex);}return nums[maxIndexes[maxIndexes.length - 1]];
};

受限于 Leetcode 更新了测试用例,此题用选择排序会出现超时,但是算法思想不变即可

http://www.lryc.cn/news/317027.html

相关文章:

  • 小资金适合做伦敦金的投资吗?
  • 自动化运维工具 ---------------Ansible
  • 富格林:有效做单安全盈利方法
  • 二分查找的理解及应用场景。
  • 共创时代,品牌如何做好UGC营销?
  • 华为三层交换机:ACL的基本实验
  • 基于springboot+vue的旅游管理系统
  • 4. git 添加版本标签
  • 2024 PhpStorm激活,分享几个PhpStorm激活的方案
  • 2419. prufer序列(prufer编码,模板题)
  • 鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)
  • 开源大数据集群部署(十五)Zookeeper集群部署
  • 服务器镜像是什么
  • JWT原理
  • 操作系统:一款纯正的“管理”软件
  • Mac笔记本聚焦SpotLight占用内存太高的 解法
  • C++中.h和.hpp文件有什么区别?
  • MongoDB聚合运算符:$derivative
  • 面试官:如果你现在有20个Spring Boot微服务,如何监视所有这些Spring Boot微服务?
  • 冯诺依曼模型
  • 高低拖延个体的任务决策及执行差异
  • 数据分析Pandas专栏---第十三章<Pandas训练题(初)>
  • Delete `␍`eslint(prettier/prettier) 错误的解决方案
  • 第3周 Python字典、集合刷题
  • 文字校对的首选——爱校对:用户真实反馈汇编
  • Llama-3即将发布:Meta公布其庞大的AI算力集群
  • 【JAVA】Date、LocalDate、LocalDateTime 详解,实践应用
  • 分布式链路追踪(一)SkyWalking(1)介绍与安装
  • 蓝桥杯历年真题省赛之 2016年 第七届 生日蜡烛
  • SCAU 8580 合并链表