选择排序的核心是选择,即只比较,比较完成一轮确定一个数的最终位置之后再进行交换
算法简单描述
存在一个大小为n的无序数组,需要进行排序
第一轮:
第1个数分别和第2到n个数比较,记录最小值的坐标,全部比较完成之后,将最小值和第1个值交换
第二轮:
第2个数分别和第3到n个数比较,记录最小值的坐标,全部比较完成之后,将最小值和第2个值交换
。。。。。。。
第n-1轮:
比较低n-1和n,若n<n-1则交换
代码
/**
* 选择排序
* @param nums
* @return
*/
private static int[] sortSelection(int[] nums){
for(int i=0;i<nums.length-1;i++){
int minIdx=i; //本轮最小值下标
for(int j=i+1;j<nums.length;j++){
if(nums[j]<nums[minIdx]){
minIdx = j;
}
}
//将最小值交换到本轮第一个位置
int num=nums[minIdx];
nums[minIdx] = nums[i];
nums[i]=num;
}
return nums;
}
时间复杂度
一共需要进行 (n-1)+(n-2)+.......+3+2+1 次处理,根据等差数列求和公式可以算出来:(a1+an)n/2 即 n(n-1)/2 ,化简得O(n的平方)