1 选择排序
选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序与冒泡排序非常的相似,都是一层层筑顶的过程,不同点在于冒泡排序会频繁的互换位置,而选择排序只是记录最大元素的位置,并与顶互换,只需交换一次,所以选择排序与冒泡排序相比时间消耗会更少,更有效率,尽管它们最坏的时间复杂度都是O(n^2)
.
2 稳定性
选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1
个元素,第n
个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择中,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。例如,序列 5、8、5、2、9,我们知道第一遍选择第 1 个元素 5 和 2 交换,那么原序列中两个 5 的相对前后顺序就被破坏了,所以选择排序是一个不稳定的排序算法。
3 排序实例
运用选择排序将数组arr[] = {3, 2, 1, 0, -1 , -2, -3}
进行排序,则其排序步骤如下:
- 初始化:
3 2 1 0 -1 -2 -3
; - 第一次:
-3 2 1 0 -1 -2 3
; - 第二次:
-3 -2 1 0 -1 2 3
; - 第三次:
-3 -2 -1 0 1 2 3
.
排序完毕。
4 Java代码
public class SelectSort {
public static void main(String[] args) {
int[] arr = {3, 2, 1, 0, -1, -2, -3};
System.out.println("Before sort:");
printArray(arr);
selectSort(arr);
System.out.println("After sort:");
printArray(arr);
}
private static void selectSort(int[] arr) {
// 判断数组是否为空或者数组元素个数为 1
if (arr == null || arr.length < 2) {
return;
}
for (int i = arr.length - 1; i > 0; i--) {
// 假设 i 是最大元素的下角标
int maxIndex = i;
// 依次将前 i-1 个元素同第 i 个元素相比较
for (int j = i - 1; j >= 0; j--) {
if (arr[j] > arr[maxIndex]) {
maxIndex = j;
}
}
// 如果最大元素的下角标不等于 i,则将其进行交换
if (maxIndex != i) {
int temp = arr[i];
arr[i] = arr[maxIndex];
arr[maxIndex] = temp;
}
}
}
/**
* 打印数组
*
* @param arr
*/
private static void printArray(int[] arr) {
System.out.print("{");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i < arr.length - 1) {
System.out.print(", ");
}
}
System.out.println("}");
}
}