冒泡排序
关于冒泡交换的动图
从小到大进行排序
原理: 比较两个相邻的元素的大小,如果左边比右边大,就交换位置。每一对都要比较
int[] arr = {1, 5, 2,3};
第一轮: for
{1, 5,2,3} 比较1和5
{1,2,5,3}比较5和2
{1,2,3,5}比较的是5和3
第二轮:
{1,2,3,5} 比较 1和2
{1,2,3,5} 比较2 和3
第三轮:
{1,2,3,5} 比较1和2
package com.qf.test;
import java.util.Arrays;
public class Demo17 {
public static void main(String[] args) {
int[] arr = {1,5, 3, 2};
for (int i = 0; i < arr.length - 1; i++) {//轮数
for (int j = 0; j < arr.length - i - 1; j++) {
//两两比较,然后如果左边比右边大的话,就交换位置
if (arr[j] > arr[j + 1]) {
//交换位置
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
}
选择排序
关于选择排序交换的动图
原理: 找到最小值的索引 , 然后和第一个数据进行交换。。再除了第一个的剩余的数据的最小值索引
然后和第二个数据进行交换。以此类推即可
int[] = {4,3 ,2,1}
先遍历一遍 找到 最小值的索引 3 然后交换位置 {1, 3, 2, 4}
再遍历一遍(除了第一个数) 找最小值的索引 2 然后交换位置 {1, 2, 3,4}
再遍历一遍(除了第前两个数) 找最小值的索引 {1, 2, 3,4}
package com.qf.test;
import java.util.Arrays;
public class Demo16 {
public static void main(String[] args) {
//选择排序
int[] arr = {4, 3, 2, 1};
/**
* i=0 0<3 minIndex=0 进入内层的for循环
* j=1 1<4 true if arr[0]>arr[1] 4>3 true minIndex=1 j++
* j=2 2<4 true if arr[1]>arr[2] 3>2 true minIndex=2 j++
* j=3 3<4 true if arr[2]>arr[3] 2>1 true minIndex=3 j++
* j=4 4<4 false 内层循环结束
* //交换位置
* int temp = 4 arr[0] = arr[3] ==>{1,3,2,1}
* arr[3] = 4====>{1,3,2,4} i++
* i=1 1<3 minIndex = 1 进入内层的for循环
* j=2 2<4 true if arr[1] >arr[2] 3>2 true minIndex = 2 j++
* \ j=3 3<4 true if arr[2] >arr[3] 2>4 false minIndex = 2 j++
* j=4 4<4 false 内层循环结束
* //交换位置
* int temp = 3 arr[1]=arr[2] ==>{1,2,2,4}
* arr[2] = 3 ===>{1,2,3,4} i++
* i= 2 2<3
*
*
*/
for (int i = 0; i < arr.length - 1; i++) {//控制轮数
int minIndex = i;//最小值的索引的变量
for (int j = i + 1; j < arr.length; j++) {//遍历按数据比较大小然后取 最小值的索引
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
//交换位置
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
System.out.println(Arrays.toString(arr));
}
}