首页 > 编程语言 >算法从入门到精通:选择排序

算法从入门到精通:选择排序

时间:2023-04-04 13:46:22浏览次数:45  
标签:入门 最小 选择 算法 array 排序 数字

一、排序和算法

排序是算法中的一部分,也叫排序算法。算法一般用来处理数据,而数据的处理最好是要找到他们的规律,这个规律中有很大一部分就是要进行排序,所以需要有排序算法。本节讲解的是选择排序,从选择排序开始认识排序的一些基础概念。之所以将选择排序作为排序的入门,原因是选择排序算法的逻辑最好理解。

二、选择排序

2.1 选择排序算法逻辑

选择排序是一种最简单的排序算法。其排序的逻辑如下:

1、有一个待排序的数组A(以下简称A)。

2、从A中找出最小的元素。

3、将找到的最小元素跟数组A中第一个元素交换位置(如果最小元素就是第一个元素,则自己跟自己交换位置);如下图:

 

(如上图,长方形高低代表数字的大小,找到最小的数字,跟第一个位置的数据进行交换)

交换之后,结果如下图所示:

 

4、然后,在剩下的4个数字中再找到最小的那个数字,跟第2个位置的数字交换。如下图:

 

交换之后的结果如下如:

 

5、再在剩下的三个数字中,找到最小的那个数字跟第3个位置的数字交换位置。上图中剩下的三个数字中最小的就是第3个位置的数字,所以,它自己跟自己交换位置,就是不变。同理第四个数字也是不变,第5个数字也是不变。(上图中例子第3、4、5个元素正好就是对应的排序,所以不变。如果不是对应的最小数字,同理交换位置就行。)

以上就是选择排序的算法逻辑,非常好理解。(如果有疑问的同学,欢迎下方留言)。

2.2 选择排序算法代码实现

理解了选择排序的逻辑之后,接下来通过java代码实现选择排序算法。步骤如下:

1、找出最小的数字

2、将最小的数字放到第一个位置

3、将第一个位置的数字,放到原本是最小数字的位置。

4、重复上面3个步骤

选择排序java代码如下:

  1.   /**
  2.   * 选择排序
  3.   */
  4.   public static void algorithm4(){
  5.   //定义一个整数类型数组,用于排序的原始数据
  6.   int[] array={3,5,1,2,4};
  7.   //获取数组的大小
  8.   int length = array.length;
  9.   //第一个循环用来遍历数组中的所有数字
  10.   for (int i = 0; i < length; i++) {
  11.   //初始化一个变量,用来记录最小数字的下标。初始默认假设第一个数字就是最小数字
  12.   int minIndex = i;
  13.   //第二个循环,通过比较获取数组中最小的数字的下标。
  14.   for (int j = i+1; j < length ; j++) {
  15.   //如果找到更小的数字,
  16.   if (array[minIndex]>=array[j]) {
  17.   //将minIndex变量的值修改为新的最小数字的下标。
  18.   minIndex = j;
  19.   }
  20.   }
  21.    
  22.   //所有数字一个个比较结束之后,就能确认那个数字最小了。
  23.   //将最小的数字替换到第一个位置,将第一个位置的数字放到最小数字原来的位置,就是一次交换。
  24.   int temp=array[i];
  25.   array[i]=array[minIndex];
  26.   array[minIndex]=temp;
  27.   }
  28.    
  29.    
  30.   //将排序之后的数组打印出来。
  31.   //下面的输出是不计算时间复杂度的,因为实际开发中这段输出代码会被删掉
  32.   for (int i = 0; i < length; i++) {
  33.   System.out.print(array[i]+",");
  34.   }
  35.    
  36.   }

以上就是选择排序的代码实现。学习了前面的时间复杂度之后,大家可以计算一下选择排序的时间复杂度是多少呢?

2.3、选择排序的时间复杂度

选择排序总共循环了所少次?

n+(n-1)+(n-2)+(n-3)+…+1

上述这个表达式,反过来写就是1+2+3+4+5+…+n。高斯算法就是(n+1)n/2=(n^2+n)/2=1/2n^2+n/2。当n->∞时,利用极限思维1/2*n^2+n/2可以等于n^2,记作O(n^2),也就是选择排序的时间复杂度是O(n^2)。

总结

选择排序是一种简单的排序算法,适用于数据量较小的情况,因为根据时间复杂度分析,数据量越大,选择排序所花费的时间按照平方倍数增长,会非常慢。但是选择排序也有它的优势,选择排序的优势就是思维逻辑简单。

选择排序还有个特点,就是不论数组的顺序是排好序或者是乱序的,选择排序都需要花费一样的时间来计算。比如,利用选择排序对数组{1,2,3,4,5}和数组{3,1,4,2,5}排序所花费的时间是一样的。

排序是算法中比较重要的内容,从简单的入手,从易到难学习常见排序算法是一个比较好的方式。如果有疑问的欢迎大家留言讨论。

标签:入门,最小,选择,算法,array,排序,数字
From: https://www.cnblogs.com/qian-fen/p/17286117.html

相关文章

  • 快速排序
    快速排序题目描述本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一,则只需选择其一进行补全提交即可。复制后需将源代码中填空部分的下划线删掉,填上你的答案。提交后若未能通过,除考虑填......
  • 【LeetCode排序专题02】最小k个数,关于快速排序的讨论
    最小k个数输入整数数组arr,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例1:输入:arr=[3,2,1],k=2输出:[1,2]或者[2,1]示例2:输入:arr=[0,1,2,1],k=1输出:[0]限制:0<=k<=arr.length<=100000<=arr[i......
  • 数学建模(三):模拟退火算法(SA)
    目录模拟退火算法(SA)一、概述1、算法简介2、核心思想3、数学原理4、模拟退火的流程二、实例分析1、初始化参数2、Metrospolis准则3、生成新的值4、获取最优值5、主程序6、总代码模拟退火算法(SA)一、概述1、算法简介模拟退火算法(simulatedannealing,SA)来源于固体......
  • golang CVE-2016-2183漏洞,https需要添加tls设置加密算法CipherSuites白名单,将弱加密算
    golangCVE-2016-2183漏洞,https需要添加tls设置加密算法白名单,将弱加密算法DES和3DES去掉。服务端样例代码packagemainimport("crypto/tls""fmt""net/http")funchandler(writerhttp.ResponseWriter,request*http.Request){fmt.Fprintf(wri......
  • 开源不到 48 小时获 35k star 的推荐算法「GitHub 热点速览」
    开源不到48小时获35kstar的推荐算法「GitHub热点速览」 本周的热点除了GPT各类衍生品之外,还多了一个被马斯克预告过、在愚人节开源出来的推特推荐算法,开源不到2天就有了35k+的star,有意思的是,除了推荐算法本身之外,阅读源码的工程师们甚至看到了员工对马斯克的特......
  • BFGS算法中的SWM公式应用
    BFGS算法矩阵$B_k$的迭代公式为:$$B_{k+1}=B_k+\frac{y_ky_k^T}{y_k^T\delta_k}-\frac{B_k\delta_k\delta_k^TB_k}{\delta_k^TB_k\delta_k}$$Sherman-Morrison公式为:假设A是n阶可逆矩阵,t为常量,u,v是n维向量,且$A+uv^T$也是可逆矩阵,则$$(A+\frac{uv^T}{t})^{-1}=A^{......
  • 数据解构之插入排序
    一、插入排序常见三种的排序交换、选择、插入。什么是插入排序?每一趟都要把待排序数放到有序区中合适的位置插入。我们以前是把数,把一个待排序数放到有序区的某一端,这是以前的排序方法。     现在不是了,现在是把待排序数放到有序区当中的合适的位置插入,要注意插入位置的确定......
  • 【初赛】各种排序算法总结
    一、算法评价排序方法平均时间最好时间最坏时间冒泡排序(稳定)O(n^2)O(n)O(n^2)选择排序(不稳定)O(n^2)O(n^2)O(n^2)插入排序(稳定)O(n^2)O(n)O(n^2)快速排序(不稳定)O(nlogn)O(nlogn)O(n^2)归并排序(稳定)O(nlogn)O(nlogn)O(nlogn)堆排序(不稳定)O(nlogn)O(nlogn)O(nlogn)基数排序......
  • 单反相机操作入门
    一、相机优势1、图像感应器面积数码单反相机与小型数码相机相比较,主要的区别就在于用于接受光线、进行成像的图像感应器面积大小不同。与通常采用1/2"图像感应器的小型数码相机相比,数码单反相机一般采用的APS-C画幅图像感应器拥有其约10倍的面积。因此在电子性能方面也有众多优点。......
  • IdWorker 雪花算法生成id
    packageentity;importjava.lang.management.ManagementFactory;importjava.net.InetAddress;importjava.net.NetworkInterface;/***<p>名称:IdWorker.java</p>*<p>描述:分布式自增长ID</p>*<pre>*Twitter的SnowflakeJAVA实现方案......