基本思想
-
简单选择排序是最简单直观的一种算法,每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序。
-
在算法实现时,每一轮确定最小元素的时候会通过不断地比较交换来使得首位置为当前最小,交换是个比较耗时的操作。其实我们很容易发现,在还未完全确定当前最小元素之前,这些交换都是无意义的。
-
因此可以通过设置一个变量min,每一次比较出存储较小元素,并且记录当前元素的数组下标,当本轮循环结束之后,那这个变量min存储的就是当前最小元素的下标,此时再执行交换操作,以此确定本轮遍历的最小元素放到了数组前部。
代码实现
package com.jie.selection;
import java.util.Arrays;
/**
* @Author 小杰
* @Date 2022/5/1 15:26
* @Version 1.0
* 选择排序
*/
public class SelectionSort {
public static void main(String[] args) {
int[] a = {126,23,3,45,5,36,7,68};
selection(a);
}
/**
* 选择排序
*
* @param a
*/
public static void selection(int[] a) {
//进行选择的轮数。
//i表示每轮选择最小元素要交换到的目标索引。
for (int i = 0; i < a.length - 1; i++) {
//代表最小元素的索引值。
int s = i;
//每一轮选择需要进行的比较。
for (int j = s + 1; j < a.length; j++) {
if (a[s]>a[j]){
//记录最小元素的索引值。
s=j;
}
}
if (s!= i){
exchange(a,s,i);
}
System.out.println(Arrays.toString(a));
}
}
/**
* 交换数组两个位置元素。
*
* @param a
* @param i
* @param j
*/
public static void exchange(int[] a, int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
算法时间空间
简单选择排序通过上面优化之后,无论数组原始排列如何,比较次数是不变的;对于交换操作,在最好情况下也就是数组完全有序的时候,无需任何交换移动,在最差情况下,也就是数组倒序的时候,交换次数为n-1次。综合下来,时间复杂度为O(n2)
- 祝你:吉时吉日喜如风,丰年丰月如风增,争富争财争长寿,寿山寿海寿长生,生富生才生贵子,子孝孙贤代代荣,荣华富贵年年有,有钱有势有前程!
- 祝你:吃不愁穿不愁,不住平方住高楼,天天潇洒,夜夜温柔,买卖如同长江水,生活如同井上花,大财小财天天进,一顺百顺发发发!
- 点点关注不迷路,感谢老铁的关注。