选择排序算法
三 ,选择排序
从算法逻辑上看,选择排序是一种简单直观的排序算法,在简单选择排序过程中,所需移动记录的次数比较少。
1,基本思想
选择排序的基本思想:比较+交换
在待排序的一组数据中,选出最小(最大)的一个数与第一个位置的数交换,然后在剩下的数中,再找最小(最大)的数与第二个位置的数交换位置,
依次类推,直到第N-1个元素与第N个元素交换位置,选择排序结束。
2,过程描述
操作方法:
第一趟:从n个记录中找出关键码最小的记录和第一个记录交换;
第二趟:从第二个记录开始的n-1个记录中再选出关键码最小的记录与第二个记录交换
以此类推......
第i趟,则从第i个记录开始的n-i+1个记录中选出关键码最小的记录与第i个记录交换,直到整个序列按关键码有序。
3,代码案例:
public class SelectSort { public static void main(String[] args) { //定义一个数组 int arr[]={3,1,2,5,4}; SelectSort(arr); System.out.println("选择排序:"+Arrays.toString(arr)); } public static void SelectSort(int[] array) { //判断数组为空或为一个元素的情况 if (null == array || array.length <= 1) { return; } //数组比较次数n-1 for (int i = 0; i < array.length - 1; i++) { int min = i;//保存当前最小元素的位置 //遍历待排序数组元素(i之后的元素) for (int j = i + 1; j < array.length; j++) { //如果已排序中 较大元素 大于 待排序元素中的 最小元素 则更换元素对应索引 if (array[min] > array[j]) { min = j; } //确保找出待排序的最小元素的编号 } //置换位置 int temp = array[min]; array[min] = array[i]; array[i] = temp; } } }
4,选择排序的时间复杂度
简单选择排序的比较次数与序列的初始排序无关。假设待排序的系列有N个元素,则比较次数总是N(N-1)/2
而移动次数与系列的初始排序有关,当排序正序时,移动次数最少,为0
当序列反序时,移动次数最多,为3N(N-1)/2
所以,综上,简单排序的时间复杂度为O(N*N)
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 |
---|---|---|---|
O(n²) | O(n²) | O(n²) | O(1) |
选择排序的简单和直观名副其实,这也造就了它”出了名的慢性子”,无论是哪种情况,哪怕原数组已排序完成,它也将花费将近n²/2次遍历来确认一遍。
即便是这样,它的排序结果也还是不稳定的。 唯一值得高兴的是,它并不耗费额外的内存空间。
法,在简单选择排序过程中,所需移动记录的次数比较少。
Java半颗糖
本文作者:试剑江湖
本文链接:https://www.cnblogs.com/iswxw/p/11234072.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!