选择排序:
- 每一次从这堆“参与比较的数据当中”找出最小值
- 拿着这个最小值和“参与比较的这堆最前面的元素”交换位置。
选择排序比冒泡排序好在:每一次的交换位置都是有意义的。
关键点:选择排序中的关键在于,你怎么找出一堆数据中最小的。
3 2 6 1 5
-
假设:
-
第一个3是最小的。
-
3和2比较,发现2更小,所以此时最小的是2.
-
继续拿着2往下比对,2和6比较,2仍然是最小的。
-
继续拿着2往下比对,2和1比对,发现1更小,所以此时最小的是1.
-
继续拿着1往下比对,1和5比对,发现1还是小的,所以1就是最小的。
-
拿着1和最左边的3交换位置。
-
假设:
-
第一个2是最小的。
-
…
6 3 5
-
-
假设6是最小的:
-
6和3比对,发现3更小,所以此时最小的是3.
-
…
选择排序比冒泡排序的效率高。
- 高在交换位置的次数上。
- 选择排序的交换位置是有意义的。
循环一次,然后找出参加比较的这堆数据中最小的,拿着这个最小的值和
最前面的数据“交换位置”。
参与比较的数据: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
注意:5条数据,循环4次。
示例代码:
public class SelectSort {
public static void main(String[] args) {
//初始化一个一维数组
int[] arr = {3,1,6,2,5,8,4};
int count = 0;
int count2 = 0;
//选择排序
//7条数据循环6次。(外层循环6次)
for(int i = 0;i< arr.length-1;i++){
//猜测最小值
//i正好是“参加比较的这堆数据中“最左边那个元素的下标”
//i是一个参与比较的这堆数据中的起点下标
//假设起点i下标位置上的元素是最小的
int min = i;
for(int j = i + 1;j< arr.length;j++) {
//统计比较次数
count++;
if (arr[j] < arr[min]) {
min = j;//最小值的元素下标是j
}
}
//当i和min相等时,表示最初猜测是对的
//当i和min不相等是,表示最初猜测是错的,有比这个元素更小的元素
//需要拿着这个更小的元素和最左边的元素交换位置
if (min != i) {
//表示存在更小的数据
//arr[min]最小的数据
//arr[i] 最前面的数据
int temp;
temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
//统计交换次数
count2++;
}
}
// 冒泡排序和选择排序实际上比较的次数没变。
// 交换位置的次数减少了。
System.out.println("比较了多少次:" + count);
System.out.println("交换了多少次:" + count2);
//遍历排序之后的数组
for (int i = 0;i< arr.length;i++){
System.out.println(arr[i]);
}
}
}
运行结果:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/87623.html