每一次从这堆“参与比较的数据当中”找出最小(大)值,拿着这个最小(大)值和“参与比较的这堆最前面的元素”交换位置。
算法步骤
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
代码(此处实现是”找出最小值,拿着这个最小值和“参与比较的这堆最前面的元素”交换位置。)
for(int i = 0; i < arr.length - 1; i++){
// 假设起点i下标位置上的元素是最小的。
int min = i;
for(int j = i + 1; j < arr.length; j++){
if(arr[j] < arr[min]){
min = j; //最小值的元素下标是j
}
}
// 当i和min相等时,表示最初猜测是对的。
// 当i和min不相等时,表示最初猜测是错的,有比这个元素更小的元素,
// 需要拿着这个更小的元素和最左边的元素交换位置。
if(min != i){
// 表示存在更小的数据
// arr[min] 最小的数据
// arr[i] 最前面的数据
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
比较次数:(n*(n - 1)) / 2
过程
参与比较的数据:3 1 6 2 5 (这一堆参加比较的数据中最左边的元素下标是0)
第1次循环之后的结果是:
1 3 6 2 5
参与比较的数据:3 6 2 5 (这一堆参加比较的数据中最左边的元素下标是1)
第2次循环之后的结果是:
2 6 3 5
参与比较的数据:6 3 5 (这一堆参加比较的数据中最左边的元素下标是2)
第3次循环之后的结果是:
3 6 5
参与比较的数据:6 5 (这一堆参加比较的数据中最左边的元素下标是3)
第4次循环之后的结果是:
5 6
循环次数: n - 1
注意:
冒泡排序和选择排序实际上比较的次数没变。只是交换位置的次数减少了。