算法之选择排序
选择排序
从学校到工作,用的最多的就是选择排序,最具讽刺的是用的还是交换次数最多的选择排序。虽然不是学软件的,也实在是汗颜啊。
算法第四版:
首先找到数组中最小的元素,将它和数组的第一个元素交换位置;如果第一个元素是最小的元素与自己交换
再次将剩下的元素找到最小的元素与第二个交换位置;
如此往复直到将整个数组排序
时间复杂度
交换次数是N次,比较次数是N的平方的二分之一。无法如何排序,比较次数都没变化。
与冒泡、插入排序相比
冒泡排序和插入排序的交换次数最坏都是N的平方的二分之一
例子
package com.java.arlgorithm.sort;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
/**
* @author
*/
@Slf4j
public class ChooseInserTest {
public static void main(String[] args) {
int[] array = new int[]{5, 6, 4, 3, 1, 6};
chooseInsert(array);
}
//交换次数太多
public static void chooseInsertBad(int[] array) {
int len = array.length;
for (int i = 0; i < len; i++) {
int tmp = array[i];
for (int j = i + 1; j < len; j++) {
if (less(array[j], tmp)) {
swap(array, i, j);
}
}
printAll(array);
}
}
public static void chooseInsert(int[] array) {
int len = array.length;
for (int i = 0; i < len; i++) {
int min = i;
for (int j = i + 1; j < len; j++) {
if (less(array[j], array[min])) {
min = j;
}
}
swap(array, i, min);
printAll(array);
}
}
public static void swap(int[] array, int src, int des) {
int tmp;
tmp = array[src];
array[src] = array[des];
array[des] = tmp;
}
public static void printAll(int[] array) {
log.info(Arrays.toString(array));
}
public static boolean less(int a, int b) {
if (a < b) {
return true;
}
return false;
}
}
结果
2019-08-20 15:51:56,687 [main] INFO ChooseInserTest - [1, 6, 4, 3, 5, 6]
2019-08-20 15:51:56,692 [main] INFO ChooseInserTest - [1, 3, 4, 6, 5, 6]
2019-08-20 15:51:56,692 [main] INFO ChooseInserTest - [1, 3, 4, 6, 5, 6]
2019-08-20 15:51:56,692 [main] INFO ChooseInserTest - [1, 3, 4, 5, 6, 6]
2019-08-20 15:51:56,692 [main] INFO ChooseInserTest - [1, 3, 4, 5, 6, 6]
2019-08-20 15:51:56,693 [main] INFO ChooseInserTest - [1, 3, 4, 5, 6, 6]