原理
从未排序的序列中选择最小元素,然后和起始位置元素交换(这样形成了局部有序序列),然后再从剩下未排列的序列中选择最小元素,和起始位置之后的一个元素交换,就这样一直到最后。
分析
第一趟:从第一个位置开始循环,找出序列的最小元素,然后和第一个位置交换
第二趟:从第二个位置开始循环,找出剩下序列的最小元素,然后和第二个位置交换
…………
代码实现
/**
* 选择排序
* @param arr
*/
public static void selectionSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
int minIndex = i;//默认最小值索引
for(int j=i+1;j<arr.length;j++){
if(arr[j]<arr[minIndex]){
minIndex = j;
}
}
if(i!=minIndex){
swap(arr,i,minIndex);
}
}
}
算法复杂度和使用场景
嵌套循环:O(n*n)
比较次数:(n-1)+(n-2)+(n-3)+…+1 = n(n-1)/2
交换操作:介于0和n-1次.
和冒泡排序相比,交换操作少。