07-冒泡排序与稀疏数组
-
冒泡排序无疑是最出名的排序算法之一,总共有八大排序
-
冒泡的排序还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人尽皆知
-
我们看到嵌套循环,应该立马就可以得到这个算法的时间复杂度为O(n^2)。
-
思考:如何优化?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package xiaoka.array; import java.util.Arrays; //冒泡排序 //1. 比较数组中,两个相邻的元素,如果第一个数比第二个数大,就交换他们的位置 //2. 每一次比较,都会产生出一个最大,或者最小的数字 //3. 下一轮则可以少一次排序 //4. 依次循环,直到结束 public class ArrayDemo07 { public static void main(String[] args) { int [] a = { 21 , 12 , 344 , 54 , 43 , 6 , 8 }; int []sort = sort(a); //调用完我们自己写的排序方法后, 返回一个排序后的数组 System.out.println(Arrays.toString(sort)); } public static int [] sort( int [] array){ //临时变量 int temp = 0 ; //外层循环, 判断我们这个要走多少次; for ( int i = 0 ; i < array.length- 1 ; i++) { //内层循环, 比价判断两个数, 如果第一个数比第二个数大, 则交换位置 for ( int j = 0 ; j < array.length- 1 -i; j++) { if (array[j+ 1 ]>array[j]){ temp = array[j]; array[j] = array[j+ 1 ]; array[j+ 1 ] = temp; } } } return array; } } |

稀疏数组
-
需求:编写五子棋游戏中,有存盘退出和续上盘的功能。
-
分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。
-
解决:稀疏数组
介绍
-
当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。
-
稀疏数组的处理方式是:
-
记录数组一共有几行几列,有多少不同的值
-
把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
-
-
如下图:左边是原始数组,右边是稀疏数组
-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | package xiaoka.array; public class ArrayDemo08 { public static void main(String[] args) { //1. 创建一个二维数组 11*11 0:没有棋子 1:黑棋 2:白棋 int [][] array1 = new int [ 11 ][ 11 ]; array1[ 1 ][ 2 ] = 1 ; array1[ 2 ][ 3 ] = 2 ; //输出原始的数组 System.out.println( "输出原始的数组" ); for ( int [] ints : array1) { 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 (array1[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 < 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]; } } } //输出稀疏数组 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( "还原" ); //1. 读取稀疏数组 int [][] array3 = new int [array2[ 0 ][ 0 ]][array2[ 0 ][ 1 ]]; //2. 给其中的元素还原它的值 for ( int i = 1 ; i < array2.length; i++) { array3[array2[i][ 0 ]][array2[i][ 1 ]] = array2[i][ 2 ]; } //3. 打印 System.out.println( "输出还原的数组" ); for ( int [] ints : array3){ for ( int anInt : ints){ System.out.print(anInt+ "\t" ); } System.out.println(); } } } |