选择排序算法:每一轮选出最小元素直接交换到左侧的思路,就是选择排序。
优势:省去了多余的元素交换 。
public void selectionSerch(int[] arr){
for(int i = 0;i<arr.length-1;i++){
//最左侧下标
int minIndex = i;
//遍历数组所有元素
for(int j = i+1; j<arr.length-1;j++){
//找到数组最小值的下标
if(arr[j]<arr[minIndex]){
minIndex = j;
}
}
//如果最小值不是最左边下标就交换赋值
if(i != minIndex){
int temp = arr[i];
arr[i] =arr[minIndex];
arr[minIndex] = temp;
}
}
时间复杂度:算法每一轮选出最小值,再交换到左侧的时间复杂度是O(n),一共迭代n-1轮,所以总的时间复杂度是O(n²)。
空间复杂度:该算法是原地排序,并没有用到额外的存储空间,所以排序的空间复杂度是O(1)。
缺点:不稳定性,当数列包含多个值相等的元素时,选择排序有可能打乱它们原有的顺序。
建议:尽管平均而言冒泡排序的交换次数多于选择排序,但是当数组中的大部分元素有序时,冒泡排序的效率是更高的。反观排序数组,无论数组的有序程度如何,元素交换次数都是n-1此。