定义:
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。(摘自百度百科)
原理:
假设给定数组int arr = {数据有n个}。
第一趟从arr[0]~arr[n-1]中选取最小值与arr[0]交换;
第二趟从arr[1]~arr[n-1]中选取最小值与arr[1]交换;
第三趟从arr[2]~arr[n-1]中选取最小值与arr[2]交换;
......
第i趟从arr[i-1]~arr[n-1]中选取最小值与arr[i-1]交换;
第n-1趟从arr[n-2]~arr[n-1]中选取最小值与arr[n-2]交换。
总共通过n-1次,得到一个按照从小到大的有序序列。
图解:
代码实现:
static void selectSort(int[] arr) {
int temp = 0;
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i; // 假设最小值的下标索引为 i
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) { // 证明arr[minIndex]并不是最小值
minIndex = j;
}
}
//在内层循环中,找到最小的数后,再进行交换
if (minIndex != i) {
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
测试:
public static void main(String[] args) {
int[] arr = { 4,2,-1,8,1};
selectSort(arr);
System.out.println(Arrays.toString(arr));
}
结果:
[-1, 1, 2, 4, 8]
算法分析:
选择排序的复杂度分析。第一次内循环比较N-1次,第二次比较N-2次,然后N-3次,N-4次,…,最后一次是1次。一共比较:(N - 1) + (N - 2) + ... + 1
,等差数列求和得:N(N-1)/2
次。
由此我们发现不管是怎样的一组数列,比较的次数永远都是N(N-1)/2
次,而交换的次数与数列的初始循序就有关了,数列为正序时:交换次数为0。
所以,简单选择排序的时间复杂度为:O(N^2)。
--------------------------------------------------------------------------------------------------------------------------------------------如果有什么不对的地方,望批评指出。