1. 基本思想
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
2. Java实现
/*
* 选择排序
*/
public static void selectSort(int[] arr)
{
int temp;
int minIndex;
for (int i = 0; i < arr.length - 1; i++)
{
minIndex = i;
for (int j = i + 1; j < arr.length; j++)
{
if (arr[j] < arr[minIndex])
{
minIndex = j;
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
测试:
public static void main(String[] args)
{
int[] arr = {10, 9, 11, 50, 55, 1, 60, 65, 5, 15, 30, 20};
System.out.print("排序前:");
for (int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}
System.out.print("\n");
selectSort(arr);
System.out.print("排序后:");
for (int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}
}
测试结果:
排序前:10 9 11 50 55 1 60 65 5 15 30 20
排序后:1 5 9 10 11 15 20 30 50 55 60 65
3. 算法分析
排序前:10 9 11 50 55 1 60 65 5 15 30 20
第1轮排序后:1 9 11 50 55 10 60 65 5 15 30 20
第2轮排序后:1 5 11 50 55 10 60 65 9 15 30 20
第3轮排序后:1 5 9 50 55 10 60 65 11 15 30 20
第4轮排序后:1 5 9 10 55 50 60 65 11 15 30 20
第5轮排序后:1 5 9 10 11 50 60 65 55 15 30 20
第6轮排序后:1 5 9 10 11 15 60 65 55 50 30 20
第7轮排序后:1 5 9 10 11 15 20 65 55 50 30 60
第8轮排序后:1 5 9 10 11 15 20 30 55 50 65 60
第9轮排序后:1 5 9 10 11 15 20 30 50 55 65 60
第10轮排序后:1 5 9 10 11 15 20 30 50 55 65 60
第11轮排序后:1 5 9 10 11 15 20 30 50 55 60 65
排序后:1 5 9 10 11 15 20 30 50 55 60 65
选择排序方法中,第1轮排序开始,每次都拿第1个元素跟后面的数据进行比较,当第1个元素比后面的数据大,则进行交换。这样经过第1轮的排序后,数组中最小的元素 1就排在了数组中的第一个位置。第2轮开始则拿第2个元素必须做比较,第二轮结束后,5 就排在了第二位。经历了11轮的排序后,排序结束,结果就是已经按照所期望的顺序进行排序后的数组。选择排序的时间复杂度为 O(n^2)。