/*
* 有10个数字要求分别用选择法和冒泡法从大到小输出
* */
public static void main(String[] args) {
/*
*
* 思路:
* 1、随机生成十个数字
* 2、选择排序
* 3、冒泡排序
*
* */
//随即生成10个数字(0~20)存入数组中
Random random = new Random();
int[] arr = new int[10];
System.out.println("初始数组:");
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(21);
System.out.print(arr[i] + " ");
}
System.out.println();
//选择排序 每次排序结束 自变量自加 数组长度自减
//初始化左右两边的索引
int maxLeft = 0;
int minRight = arr.length - 1;
while (minRight > maxLeft) {
//同时选择最大值和最小值 并初始化 假设最大值时第一个 最小值是最后一个
//初始化最小值和最大值的索引
int minIndex = minRight;
int maxIndex = maxLeft;
for (int i = maxLeft; i <= minRight; i++) {//这里千万要调用外部变量 不要调用循环内的变量,不然会意外退出
if (arr[maxIndex] < arr[i]) {
maxIndex = i;
}
if (arr[minIndex] > arr[i]) {
minIndex = i;
}
}
/*
* 在这里有个不需要注意的点:
* 有的同学比较好奇,为什么不把最大最小值的交换放在if判断语句里
* 因为for循环里面有两个判断语句,会相互影响
* 选择排序的核心思想是每次从未排序的部分中选择最小(或最大)的元素,并将其放置在已排序部分的末尾。
* 在选择排序的实现中,我们需要使用一个临时变量来存储最小元素的值,并将其与当前位置的元素进行交换。
* 选择排序的互换操作不能写在if语句里,因为if语句只是用来判断最小元素的位置,并不会进行实际的交换操作。
* 如果我们将互换操作写在if语句里,那么每次判断都会进行一次交换操作,这样会导致排序结果错误。
*
* */
//存储最大值在最左端
int temp = arr[maxIndex];
arr[maxIndex] = arr[maxLeft];
arr[maxLeft] = temp;
if (minIndex == maxLeft) {
minIndex = maxIndex;
}
//存储最小值在最右端
temp = arr[minIndex];
arr[minIndex] = arr[minRight];
arr[minRight] = temp;
minRight--;
maxLeft++;
}
System.out.println("选择排序:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
//冒泡排序
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1; j++) {
if (arr[j] < arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println("冒泡排序:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
这里我将两种排序写在一起了,如果想要验证只需要将另一个代码段注释掉即可
输出结果: