一、简单选择排序

1.基本思想:

在长度为N的无序数组中,第一次遍历n-1个数,找到最小的数值与第一个元素交换;
第二次遍历n-2个数,找到最小的数值与第二个元素交换;
。。。
第n-1次遍历,找到最小的数值与第n-1个元素交换,排序完成。

2.过程

3.代码

public static void selectSort(int[] arr) {int minNum = 0;int temp = 0;int a = 0;for (int i = 0; i < arr.length; i++) {boolean flag = false;minNum = arr[i];for (int j = i + 1; j < arr.length; j++) {if (minNum > arr[j]) {minNum = arr[j];a = j;flag = true;}}if (flag) {temp = arr[i];arr[i] = minNum;arr[a] = temp;}}}

4.复杂度分析

选择排序的交换次数介于0~(n-1)之间;
比较次数为n(n-1)/2之间
交换次数远远小于冒泡排序;由于cpu计算时,交换时间大于比较时间,所以当n较小时,选择排序优于冒泡排序。
平均时间复杂度:O(n^2)

5.稳定性分析

当两个相同的数据相邻时,如果一个更小的数据比这两个数据要小,那么就会与这两个数据的第一个进行交换;那么这就破坏了原先数据的有序性,所以不稳定。

二、优化

1.思路

使用两个变量,分别指向数组的头尾;每次遍历数组过程中,找到无序表中的最大值与最小值进行交换

2.代码

public static void selectSort2(int arr[]) {int left = 0;int right = arr.length - 1;while (left < right) {int max = right;int min = left;for (int j = left; j <= right; j++) {if (arr[max] < arr[j]) {max = j;}if (arr[min] > arr[j]) {min = j;}}if (min != left) {swap(arr, min, left);}if (max == left) {max = min;}if (max != right) {swap(arr, max, right);}left++;right--;}}

3.优化后的复杂度分析

减少了交换次数,交换次数为n/2
平均时间复杂度为O(n^2)
依旧不稳定

十大经典排序算法之选择排序及其优化相关推荐

  1. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  2. Java经典排序算法:选择排序,动图演示排序过程

    Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...

  3. 【十大经典数据挖掘算法】k-means

    [十大经典数据挖掘算法]k-means https://mp.weixin.qq.com/s/SWlE-KBJ4mVza92nJFX1hg 作者简介: Treant  人工智能爱好者社区专栏作者 博客 ...

  4. 【十大经典数据挖掘算法】Naïve Bayes

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 朴素贝叶斯(Naïve Bayes) ...

  5. 【十大经典数据挖掘算法】C4.5

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 决策树模型与学习 决策树(de ...

  6. 堆排序算法c语言筛选法,【排序】排序算法之选择排序

    排序算法之选择排序 罗朝辉(http://www.cppblog.com/kesalin) 转载请注明出处 排序是数据处理中经常使用的一种重要运算,在计算机及其应用系统中,花费在排序上的时间在系统运行 ...

  7. 【排序算法】选择排序(C语言)

    [排序算法]-- 选择排序 目录 一.选择排序的原理 二.选择排序的代码实现 三.选择排序的优化 1. 优化思路 2. 排序优化后问题 3. 优化代码的实现 四.选择排序的效率 一.选择排序的原理 ​ ...

  8. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  9. 排序算法 | 直接选择排序,算法的图解、实现、复杂度和稳定性分析

    排序算法 | 直接选择排序,算法的图解.实现.复杂度和稳定性分析 目录 1.直接选择排序的原理 2.图解直接选择排序 3.算法代码实现 4.算法复杂度分析.稳定性分析 直接选择排序 1.直接选择排序的 ...

  10. 【十大经典数据挖掘算法】PageRank

    作者简介: Treant 人工智能爱好者社区专栏作者 博客专栏:https://www.cnblogs.com/en-heng 引言 PageRank是Sergey Brin与Larry Page于1 ...

最新文章

  1. ACE库的LOGGING记录使用摘要(1)
  2. idea没有错误出现红色波浪线怎么去掉?
  3. netlink怎么读_ovs源码阅读--netlink使用
  4. Excel共享工作簿
  5. 了解有关JDK9紧凑弦乐的信息(视频回顾Charlie Hunt)
  6. Error: if there's nested data, rowKey is required.
  7. C语言解析Ini格式文件
  8. Vue-在data中引入静态图片路径
  9. js简单正则表达式验证密码
  10. python+grpc+yolo 目标检测实践
  11. React中的图片懒加载
  12. linux md5sum 文件夹,每天一个 Linux 命令(63):cksum、md5sum、sha1sum命令
  13. 朱晔的互联网架构实践心得S2E3:品味Kubernetes的设计理念
  14. Linux内存管理 - slab分配器和kmalloc
  15. python爬虫之通用爬虫和聚焦爬虫
  16. 阿里云产品推荐——专有网络 VPC
  17. d3.js 旋转图形_视觉效果和动态图形软件After Effects 2019 v16.1.3.5 Win/Mac 中文/英文/多语言破解版...
  18. 高解析APNG(动画PNG). 2D. 3D APNG's的动态图
  19. android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...
  20. 自主研发项目七之学生电子班牌系统

热门文章

  1. 嵌入式系统 Contiki 代码移至 Github
  2. [笔记] systemverilog学习笔录
  3. WebService开发
  4. python一行代码实现99乘法表_一行代码实现九九乘法表
  5. linux删除文件退出,在Linux中用于在移动或删除文件时使`tail -f`退出的bash脚本
  6. python接口测试覆盖率统计_从 jacoco 报告数据分析,python 脚本实现增量覆盖率统计...
  7. excel填充序列_excel如何快速填充数据
  8. python接口自动化用例管理_python接口自动化测试(六)-unittest-单个用例管理
  9. php5.1 0day,DEDECMS 5.1 feedback_js.php 0DAY
  10. zabbix前端php界面,zabbix简介及安装