1️⃣ 一、冒泡排序
🚋 1、简介
冒泡排序分为两层循环,外层冒泡轮数,里层依次比较,由于是嵌套循环
,所以时间复杂度为 O(n^2)
🎈 2、过程
- 比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置;
- 每一次比较,都会产生出一个极大,或者极小的数字;
- 下一轮则可以少一次排序;
- 依次循环,直到结束。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] a = {1, 5, 2, 9, 22, 6, 0, 3};
System.out.println(Arrays.toString(sort(a)));
}
public static int[] sort(int[] a) {
int temp = 0;
for (int i = 0; i < a.length - 1; i++) {
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
return a;
}
}
🌈 3、优化
由于在冒泡的过程中,存在事先已经排序好了的元素,
如: 1 2 5 4 7 5;------->这里的 1 和 2 、4 和 7 符合条件,不需要进行没有意义的比较
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] a = {1, 5, 2, 9, 22, 6, 0, 3};
System.out.println(Arrays.toString(sort(a)));
}
public static int[] sort(int[] a) {
int temp = 0;
boolean flag;
for (int i = 0; i < a.length - 1; i++) {
flag = false;
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = true;//说明当前轮需要比较
}
}
if(!flag){
break;//进行下一轮比较
}
}
return a;
}
}
2️⃣ 二、稀疏数组
🚋 1、简介
当一个数组中的大部分元素为 0 ,或者为同一值的数组时,可以使用稀疏数组来保存该数组
处理方式
1. 记录数组一共有几行几列,有多少个不同的值 —— 第 0 行
1. 把具有不同的元素 按 行 、 列 和 值 , 分别记录在一个小规模的数组中,从而缩小程序的规模。
🎈 2、操作流程
原始数组:
0 1 0 0 0
0 0 2 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
转换为稀疏数组:
行 列 值
5 5 2
0 1 1
1 2 2还原为原始数组:
0 1 0 0 0
0 0 2 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
🌈 3、代码演示
public class Main {
public static void main(String[] args) {
/*
模拟五子棋盘
用 0 代表空
用 1 代表白子
用 2 代表黑子
*/
//原始数组
int[][] array1 = new int[5][5];
array1[1][2] = 2;
array1[0][1] = 1;
System.out.println("原始数组:");
for (int[] a : array1) {
for (int b : a) {
System.out.print(b + "\t");
}
System.out.println();
}
System.out.println("==============================");
//稀疏数组
/*
行 列 值
[0] 5 5 2 ---------->原始数组有多少行 原始数组有多少列 原始数组有多少个非0的取值
[1] 0 1 1 ---------->在原始数组中的位置与取值
[2] 1 2 2 ---------->在原始数组中的位置与取值
*/
System.out.println("转换为稀疏数组:");
int num = 0;//记入原始数组中非0元素的个数
for (int[] a : array1) {
for (int b : a) {
if (b != 0) {
num++;
}
}
}
int[][] array2 = new int[num + 1][3];//这里的3列是固定的
array2[0][0] = array1.length;//行
array2[0][1] = array1[0].length;//列
array2[0][2] = num;//值
int count = 0;
for (int i = 0; i < array1.length; i++) {
for (int j = 0; j < array1[i].length; j++) {
if (array1[i][j] != 0) {
count++;
array2[count][0] = i;
array2[count][1] = j;
array2[count][2] = array1[i][j];
}
}
}
for (int[] b : array2) {
for (int c : b) {
System.out.print(c + "\t");
}
System.out.println();
}
System.out.println("==============================");
System.out.println("还原为原始数组:");
int[][] array3 = new int[array2[0][0]][array2[0][1]];
for (int i = 1; i < array2.length; i++) {
array3[array2[i][0]][array2[i][1]] = array2[i][2];
}
for (int[] b : array3) {
for (int c : b) {
System.out.print(c + "\t");
}
System.out.println();
}
}
}
说在最后📝:
✍创作不易,如果觉得文章写得还可以的话,就不要吝啬你的 👍 啦~ ✍