Arrays类、冒泡排序和稀疏数组

Arrays类、冒泡排序和稀疏数组

一、Arrays类的定义

Arrays类位于 java.util 包中,主要包含了操纵数组的各种方法

使用时导包:import java.util.Arrays

二、Arrays常用函数(都是静态的)

1.void Arrays.sort()

void Array.sort(Object[] array)

功能:对数组按照升序排序

示例

复制代码

        int[] nums = {2,5,0,4,6,-10};
       Arrays.sort(nums);
       for(int i :nums)
           System.out.print(i+" ");
       /* 之前:2 5 0 4 6 -10
        * 结果:-10 0 2 4 5 6
        */

复制代码

Arrays.sort(Object[] array, int from, int to)

功能:对数组元素指定范围进行排序(排序范围是从元素下标为from,到下标为to-1的元素进行排序)

示例

复制代码

int[] nums = {2,5,0,4,1,-10};
       //对前四位元素进行排序
       Arrays.sort(nums, 0, 4);
       for(int i :nums)
           System.out.print(i+" ");
       /* 之前:2 5 0 4 1 -10
        * 结果:0 2 4 5 1 -10
        */

复制代码

2.Arrays.fill(Object[] array,Object object)

功能:可以为数组元素填充相同的值

复制代码

int[] nums = {2,5,0,4,1,-10};
       Arrays.fill(nums, 1);
       for(int i :nums)
           System.out.print(i+" ");
       /* 之前:2 5 0 4 1 -10
        * 结果:1 1 1 1 1 1
        */

复制代码

Arrays.fill(Object[] array,int from,int to,Object object)

功能:对数组的部分元素填充一个值,从起始位置到结束位置,取头不取尾

复制代码

int[] nums = {2,5,0,4,1,-10};
       //对数组元素下标2到4的元素赋值为3
       Arrays.fill(nums,2,5,3);
       for(int i :nums)
           System.out.print(i+" ");
       /* 之前:2 5 0 4 1 -10
        * 结果:2 5 3 3 3 -10
        */

复制代码

3.Arrays.toString(Object[] array)

功能:返回数组的字符串形式

示例

        int[] nums = {2,5,0,4,1,-10};
       System.out.println(Arrays.toString(nums));
       /*
        * 结果:[2, 5, 0, 4, 1, -10]
        */

4.Arrays.deepToString(Object arrays)

功能:返回多维数组的字符串形式

示例

int[][] nums = {{1,2},{3,4}};
       System.out.println(Arrays.deepToString(nums));
       /*
        * 结果:[[1, 2], [3, 4]]
        */

Array的典例

package methods;

import java.util.Arrays;

public class ArraysDemo {

public static void main(String[] args) {
int[] a = {1,4,3,369,196,888,35,31,6};

System.out.println(a);  //[I@4e8a88a9
//打印数组元素
System.out.println(Arrays.toString(a));
System.out.println("===================================");
       //printArray(a);

Arrays.sort(a);   //数组进行排序:升序
System.out.println(Arrays.toString(a));

Arrays.fill(a,2,4,0);
System.out.println(Arrays.toString(a));
}

public static void printArray(int[] a){
for (int i = 0; i < a.length; i++) {
if(i==0){
System.out.print("[");
}
if(i==a.length-1){
System.out.print(a[i]+"]");
}else{
System.out.print(a[i]+", ");
}
}
}
}

二:冒泡排序

排序结果:数据从小到大。

首先说一下冒泡排序的思想:每次比较从第一个数据开始,数据两两比较,如果左边数据比右边数据大,则交换左右数据。继续比较。一次比较结束出现一个最大值在最后一个位置。

思想就是代码的体现,掌握思想写代码66的。

我以5个数据为例集合冒泡排序的思想进行图解说明。 数据为 8、5 、2 、6 、1。 第一次比较过程如下: 这里写图片描述

简单说明: 每次比较从第一个数据开始,也就是8开始。数据两两比较,也就是8和5进行比较。如果左边数据比右边数据大,则交换左右数据,也就是8比5大,8和5的位置交换。继续比较,也就是交换位置后,8继续和后面的数据比较。当最大值8出现在了最后一个位置时,第一次比较结束。当下一次比较,8已经是最大值就没必要参与比较。

第二次比较过程如下: 这里写图片描述

简单说明:第二次比较过程和第一次比较过程是一致的,第二次比较最大值6出现在最后一个位置。下一次比较,最大值6不参与比较。

第三次比较过程如下: 这里写图片描述 简单说明:第三次比较最大值5出现最后一个位置,下次比较,5不参与比较。

第四次比较过程如下: 这里写图片描述

简单说明:第四次比较最大值2出现最后一个位置。至此,所有数据排序过程结束。

思路总结

java实现冒泡排序

一、冒泡排序:

利用冒泡排序对数组进行排序

二、基本概念:

依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。

三、实现思路:

用二重循环实现,外循环变量设为i,内循环变量设为j。假如有n个数需要进行排序,则外循环重复n-1次,内循环依次重复n-1,n-2,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,...,n-1,对于每一个i,j的值依次为0,1,2,...n-i 。

冒泡排序的典例

package methods;

import java.util.Arrays;

public class mpDemo {
// 冒泡排序
// 1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换位置
// 2.每一次比较,都会产生出一个最大,或者最小的数字
// 3.下一轮则可以少一次排序
// 4.依次循环,直到结束!
public static void main(String[] args) {
int[] a = {1,4,3,369,196,888,35,31,65};
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++) {

boolean flag = false; //通过flag标识位减少没有意义的比较

//内层循环,比较判断两个数,如果第一个数比第二个数小,则交换位置
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;
flag = true;
}
}
if(flag == false){
break;
}
}
return array;
}
}

三:稀疏数组

一、线性结构

  • 线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系

  • 线性结构有两种不同存储结构,即顺序存储结构链式存储结构

  • 顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的,即在内存中是连续的,例如数组

  • 链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息,但好处是可以充分利用碎片地址

  • 线性结构常见的有:数组、队列、链表和栈,后面我们会详细讲解.

二、非线性结构

非线性结构不是一对一的关系, 非线性结构包括:二维数组,多维数组,广义表,树结构,图结构

三、稀疏数组

先看一个世纪需求,在编写五子棋程序时,有存盘退出和续上盘的功能 在这里插入图片描述

因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据,因此,在这里,我们需要引入一个新的概念——稀疏数组

简介

当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组,稀疏数组的处理方法是:

  • 记录数组一共有几行几列,有多少个不同的值

  • 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模

举例

在这里插入图片描述 即第一行第一列记录记录原始数组行数,第一行第二列记录原始数组列数,第一行第三列总共有多少个值,第二行记录第一个有效数据,第三行记录第二个有效数据

应用实例

  • 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)

  • 把稀疏数组存盘,可以重新恢复原来的二维数组数

  • 整体思路分析 在这里插入图片描述

稀疏数组的典例

package methods;

public class xuDemo {

public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个二维数组 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 : array1){
for(int anInt : ints){
System.out.print(anInt+"\t");
}
System.out.println();
}
}

}

东西比较杂 网上搜集的,哈哈,见谅!

 

posted @ 2020-09-12 17:23  墨染念颖  阅读(203)  评论(0编辑  收藏  举报