冒泡排序
冒泡排序动画理解:https://visualgo.net/zh/sorting
思路
- 总共要经过arr.length-1趟排序,每次排序要经过arr.length - 1 - i(i是趟数)
- 需要一个中间变量用来交换数组里面数据的位置
- 需要一个标识符,用来确认一趟下来是否有进行交换数据位置,标识符在进行一趟之后要重置标识符值
代码实现
package com.lilvencent.sort;
import java.util.Arrays;
/**
* @author Lil
*/
public class Buddling {
public static void main(String[] args) {
int arr[] = {3,9,-1,10,-2};
System.out.println("排序前");
System.out.println(Arrays.toString(arr));
BuddlingSort(arr);
}
public static void BuddlingSort(int[] arr){
int temp = 0;// 临时变量,用来交换位置
boolean flag = false;// 标识变量,表示是否进行过交换
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 如果前面的数比后面的数大,则交换
flag = true;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第" + (i + 1) + "趟排序后的数组");
System.out.println(Arrays.toString(arr));
if (!flag){// 在一趟排序中,一次交换都没有发生过
break;
}else {
flag = false;// 重置flag!!!, 进行下次判断
}
}
}
}
输出结果:
选择排序
思路
- 每次排序前假设第一个数是最小的数,第一个数的下标也是最小数的下标(此处的第一个数是每趟排序的第一个)
- 通过循环数组,找到后面的数中最小且比第一个数小的和第一个交换
- 总共要经过arr.length-1躺排序
代码实现
package com.lilvencent.sort;
import java.util.Arrays;
/**
* @author Lil
* @date 2020/11/29 23:51
*/
public class Select {
public static void main(String[] args) {
int arr[] = {101,34,119,1};
System.out.println("排列前");
System.out.println(Arrays.toString(arr));
SelectSort(arr);
System.out.println("第一次排列后");
System.out.println(Arrays.toString(arr));
}
public static void SelectSort(int[] arr){
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;//存最小值的下标
int min = arr[i];//存最小值
for (int j = i + 1; j < arr.length; j++) {
if(arr[j] < min){
min = arr[j];
minIndex = j;
}
}
if (minIndex != i){
arr[minIndex] = arr[i];//把较大的数放到后面
arr[i] = min;//再把循环找到的最小值放到第一个(相对的第一个)
}
}
}
}
输出结果:
插入排序
排序过程:https://visualgo.net/zh/sorting
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IALWBKNO-1606719769178)(https://raw.githubusercontent.com/Lil-Vincent/picgobed/master/20201130145741.png)]
代码实现:
package com.lilvencent.sort;
import java.util.Arrays;
/**
* @author Lil
* @date 2020/11/30 1:35
*/
public class Insert {
public static void main(String[] args) {
int arr[] = {101,34,119,1};
insertSort(arr);
}
public static void insertSort(int[] arr){
int insertVal = 0;
int insertIndex = 0;
for (int i = 1; i < arr.length; i++) {
//定义待插入的数
insertVal = arr[i];
insertIndex = i - 1;
while (insertIndex >= 0 && insertVal < arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
if(insertIndex + 1 != i) {
arr[insertIndex + 1] = insertVal;
}
System.out.println("第"+i+"轮插入");
System.out.println(Arrays.toString(arr));
}
}
}