冒泡排序:
import java.util.Arrays;
/*
* 冒泡排序是最出名的排序算法之一,总共有八大排序。
* 冒泡排序的代码为两层循环,外层冒泡轮数,里层依次比较。
* 这个算法的时间复杂度为O(n2)
*/
public class Demo9 {
public static void main(String[] args) {
int[] numbers = {1,7,6,3,2,22,111};
int[] bubbling = Bubbling(numbers); //调用Bubbling方法返回一个新数组 bubbling
System.out.println(Arrays.toString(bubbling)); //通过Arrays.toString输出排序后的数组
for (int i = 0;i<numbers.length;i++){
System.out.print(numbers[i]+"\t"); //通过for输出排序后的数组
}
}
/*
冒泡排序:
1. 比较数组中,两个相邻的元素,如果第一个数比第二个数大,就交换他们的值。
2. 每一次比较都会产生一个大的数字和小的数字。
3. 下一轮则可少一次排序!
4. 依次循环,直到结束。
*/
public static int[] Bubbling(int[] array){
for (int i = 0; i < array.length-1; i++ ){ //外层循环 冒泡的轮数
for (int j = 0; j < array.length-1-i;j++){ //内存循环 比较的次数
if (array[j]<array[j+1]){ //array[j] > array[j+1] 则交换两个数的值
int temp = array[j];
array[j] = array[j+1]; //定义了一个新变量temp,每次比较时它作为中间变量,使两个变量完成交换
array[j+1] = temp;
}
}
}
return array; //返回比较后的数组的值
}
}
稀疏数组:
/*
* 稀疏数组介绍:
* 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
* 稀疏数组的处理方式是:
* 1.记录数组一共有几行几列,有多少个不同值。
* 2.把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模。
* 几行几列,并且通过坐标
* 如下图:左边是原始数组,右边是稀疏数组
*/
/*
* 使用二维数组记录棋盘: 11行11列
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 1 0 0 0 0 0 0 0 0
* 0 0 0 2 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 0 0 0 0 0 0 0 0 0 0 0
* 黑棋子用1代表,白棋子用2代表
* 分析问题:因为该二维数组的很多值默认值是0,因此记录了很多没有意义的数据。
* 解决方式:稀疏数组
*/
public class Demo10 {
public static void main(String[] args) {
//1.创建一个二维数组
// 11*11 0:没有棋子 1:黑棋子 2:白棋子
int[][] array = new int[11][11];
array [1][2] = 1;
array [2][3] = 2;
//输出原始的数组
System.out.println("原始的数组:");
for (int[] ints : array) { //for each 循环
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("------------------------------------------");
//转换为稀疏数组保存
int sum = 0; //保存有效值的个数
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 11; j++) {
if (array[i][j]!=0){
sum++;
}
}
}
System.out.println("有效值的个数为:"+sum);
//2.创建一个稀疏数组
int[][] array2 = new int[sum+1][3];
array2[0][0] = 11;
array2[0][1] = 11;
array2[0][2] = sum;
//遍历二维数组,将非零的值,存放在稀疏数组中
int count = 0;
for (int i = 0; i < array.length ; i++){
for (int j = 0; j < array[i].length; j++){
if (array[i][j]!=0){ //如果数组中的数字不为0
count++;
array2[count][0] = i; //存放行
array2[count][1] = j; //存放列
array2[count][2] = array[i][j]; //存放值
}
}
}
//输出稀疏数组:
System.out.println("稀疏数组为:");
for (int i = 0; i < array2.length; i++){
System.out.println(array2[i][0]+"\t"
+array2[i][1]+"\t"
+array2[i][2]+"\t");
}
System.out.println("------------------------------------------");
System.out.println("还原:");
//读取稀疏数组:
int[][] array3 = new int[array2[0][0]][array2[0][1]]; // 11*11
//给其中的元素还原它的值:
//其他行列中没有值 默认为0
for (int i = 1; i < array2.length; i++){
array3[array2[i][0]][array2[i][1]] = array2[i][2]; //[array2[i][0]]为行,[array2[i][1]]为列,array2[i][2]为值
}
//打印还原后的数组
System.out.println("还原后的数组为:");
for (int[] ints : array3) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
}