一、排序原理
1.每一次遍历的过程中,都假定第一个索引处的元素 是最小值,和其他索引处的值依次进行比较,如果当前索引处的值大于其他某个索引处的值,则假定其他某个索引出的值为最小值,最后可以找到最小值所在的索引。
2.交换第一个索引|处和最小值所在的索引处的值
(即每次将一个元素放到合适的位置)
二、API设计
三、代码实现
【Selection .java】
package cn.Da_xiong.algorithm.Demo3.sort;
//选择排序
public class Selection {
//对数据a中的元素排序
public static void sort(Comparable[] a){
//从当前索引处与其他每个索引处的值比较,比到倒数第二个就可以了
//这里i为当前的索引位置下标
for(int i=0;i<a.length-1;i++){
// 这里i从0最大到n-2,其实就是遍历n-1次,也可以写成i<=a.length-2
//定义一个变量 记录最小元素所在的索引,默认为参与选择排序的第一个元素所在的位置
int minIndex = i;
for(int j=i+1;j<a.length;j++){
//j就是未排序到合适位置的所有元素的索引下标
//比较最小索引minIndex处的值和j索引处的值
//如果j索引处的值更小,就就将它的值传给a数组minIndex处
if(greater(a[minIndex],a[j])){
minIndex = j;
}
}
//一个for循环遍历完就找到了第一个最小的索引位置:minIndex
//将最小元素索引minIndex处的值与索引i处的值进行交换
exch(a,i,minIndex);
}
}
//比较v元素是否大于w元素
public static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
//数组元素i和j交换位置
public static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
【SelectionTest .java】
package cn.Da_xiong.algorithm.Demo3.test;
//选择排序
import cn.Da_xiong.algorithm.Demo3.sort.Selection;
import java.util.Arrays;
public class SelectionTest {
public static void main(String[] args) {
//原始数据
Integer[] a= {4,6,8,9,2,10,1};
Selection.sort(a);
System.out.println(Arrays.toString(a));
}
}
【运行结果】
四、时间复杂度分析
最坏情况:
例子:假如对6,5,4,3,2,1进行排序
第一次遍历,假设第一个元素索引为i,minIndex=i;从minIndex处与i后面的每个元素j比较
外层for循环: int i=0;i<a[].length-1;i++ 到倒数第二个结束(等同于 i<=a[].length-2)
从索引0开始,内层for循环遍历完就i+1,第一次把最小的放到第一个索引位置,第二小的放第二个索引,依次下去…
元素比较总次数为:
(n-1)+(n-2)+(n-3)+...+2+1=(n^2-n)/2
元素交换总次数 为:
n-1
算法总执行次数为=元素比较总次数+元素总执行次数
=(n^2-n)/2+(n-1)
=n^2/2+n/2-1
根据大0推导法则,选择排序的时间复杂度为0(N^2)
ps:选择排序与冒泡排序、插入排序复杂度一样;效率较低,适用于待排序元素较少的时候使用;
喜欢的话记得点赞收藏哟😊
数据结构与算法—博文专栏持续更新!