首页 > 编程语言 >Java——数组排序

Java——数组排序

时间:2024-06-08 15:58:02浏览次数:32  
标签:arr Java int 冒泡排序 数组 排序 public

 一、排序介绍

1、排序的概念

排序是将多个数据按照指定的顺序进行排列的过程。

2、排序的种类

排序可以分为两大类:内部排序和外部排序。

3、内部排序和外部排序

1)内部排序

内部排序是指数据在内存中进行排序,适用于数据量较小的情况。数据可以完全装入内存。常见的内部排序算法包括:

  • 交换排序法:如冒泡排序、快速排序等。
  • 选择排序法:如选择排序、堆排序等。
  • 插入排序法:如直接插入排序、希尔排序等。

2)外部排序

外部排序是指数据量大到无法完全装入内存,需要借助外部存储器(如磁盘)进行排序。常见的外部排序算法包括:

  • 合并排序法:如多路归并排序。
  • 分配排序法:如基数排序。

二、冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法。它的工作原理是重复地遍历要排序的序列,一次比较两个元素,如果它们的顺序错误则交换它们的位置。这个过程会将每次遍历中最大的元素“冒泡”到序列的末尾,类似于气泡在水中上升。

1、冒泡排序图解

这里使用 5 个元素的数组作为例子:

第一轮:

第二轮:

第三轮:

第四轮:

我们可以发现,对于元素个数为 n 的数组,使用冒泡排序需要 n - 1 轮,第一轮需要 n - 1 步,后面的每一轮的步骤数依次递减一。

2、冒泡排序代码实现

上面我们对冒泡排序的具体原理进行了详细的分析,下面我们将使用代码对数组的冒泡排序进行实现。

import java.util.Arrays;

public class Test {
	public static void main(String[] args) {
		int[] arr = {5, 4, 3, 2, 1};
		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]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		System.out.println("排序后的数组为 " + Arrays.toString(arr));
	}	
}

运行结果:

我们也可以详细看看每一轮执行后排序的结果:

import java.util.Arrays;

public class Test {
	public static void main(String[] args) {
		int[] arr = {5, 4, 3, 2, 1};
		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]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
			System.out.println("\n第一轮\n" + Arrays.toString(arr));
		}
		System.out.println("\n最终排序好的的数组为\n" + Arrays.toString(arr));
	}	
}

运行结果:

可以发现与我们上面分析的一致。

3、冒泡排序优化

可以使用一个状态变量,如果某一轮进行了交换,则代表未排序的部分是无序的;如果某一轮未进行交换,就代表没有排序的部分已经是有序的了,就不用排序了,则可以退出循环。

import java.util.Arrays;

public class Test {
	public static void main(String[] args) {
		int[] arr = {1, 2, 4, 3, 5};
		boolean isSwap = false;
		for(int i = 0; i < arr.length - 1; i++) {
			isSwap = false;
			for(int j = 0; j < arr.length - 1 - i; j++) {
				if(arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					isSwap = true;
				}
			}
			if(!isSwap) {
				break;
			}
		}
		System.out.println("最终排序好的的数组为\n" + Arrays.toString(arr));
	}	
}

这里使用一个 boolean 类型变量,开始初始化为 false,如果进行交换了,则将其赋值为 true,再一轮的最后进行判断是否进行过交换,如果没有进行交换,也就是这个状态变量为 false 则退出外层循环,排序完成。

这种冒泡排序再进行一些部分有序的数组的排序任务中,会比为优化的冒泡排序性能更高些。

上面的代码运行结果:

三、数组元素查找

1、顺序查找

顺序查找是一种简单的查找算法,它从数组的第一个元素开始,逐个比较每个元素,直到找到目标元素或遍历完整个数组。顺序查找不需要数组是有序的。

public class Test {
	public static void main(String[] args) {
		int[] arr = {1, 2, 3, 4, 5};
		int searchNum = 3;
		for(int i = 0; i < arr.length; i++) {
			if(arr[i] == searchNum) {
				System.out.println("arr[" + i + "] = " + searchNum);
				break;
			}
		}
	}	
}

运行结果:

标签:arr,Java,int,冒泡排序,数组,排序,public
From: https://blog.csdn.net/stewie6/article/details/139547483

相关文章

  • C++U7-08-拓扑排序
    拓扑:是指把实体抽象成与其大小形状无关的点,把连接实体的线路抽象成线,研究这些点线之间的相连关系。而表示点和线之间关系的图就被称为拓扑结构图。 拓扑学原本是一个数学概念,描述的是几何图形或空间在连续改变形状后还能保持不变的性质,它只考虑物体间的位置关系而......
  • Java 集合
    ListArrayList和LinkedList有什么区别?数据结构不同,ArrayList基于数组实现,LinkedList基于双向链表实现使用场景不同,ArrayList用于查多写少的场景,LinkedList多用于写多查少的场景查询:ArrayList支持随机访问,可以通过下标直接获取元素,时间复杂度是O(1)LinkedList需要遍历链表......
  • 【计算机毕业设计】springboot287基于javaEE的校园二手书交易平台的设计与实现
    信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容......
  • 二叉排序树--c++
    【相关知识】二叉排序树(也称二叉查找树):或者是一棵空的二叉树,或者是具有下列性质的二叉树:⑴若它的左子树不空,则左子树上所有结点的值均小于根结点的值;⑵若它的右子树不空,则右子树上所有结点的值均大于根结点的值;⑶它的左右子树也都是二叉排序树。【题目描述】①给定......
  • java面试题及答案2024,java2024最新面试题及答案(之一)
    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~本套Java面试题大全,全的不能再全,哈哈~一、Java基础1.JDK和JRE有什么区别?JDK:JavaDevelopmentKit的简称,java开发工具包,提供了java的开发环境和运行环境。JR......
  • java面试题及答案2024,java2024最新面试题及答案(之二)
    四、反射57.什么是反射?反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力Java反射:在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法Java反射机制主要提供了以下功能:在运行时判断任意一个对象所......
  • Java——数组
    一、数组介绍数组是Java中的一种数据结构,用于存储一组相同类型的元素。它们在内存中是连续存储的,并且通过索引来访问元素。以下是关于Java数组的详细介绍:1、数组的创建和初始化在Java中,数组是一种对象,它可以存储固定大小的同类型元素。数组的大小在创建时确定,并且一旦创建就......
  • Java 实验8 集合类
    (一)实验目的1、掌握JAVA集合类中的Collection的特点及其应用情形;3、掌握Collection、熟悉集合的特点及应用。(二)实验内容和步骤1、仿照课堂练习的MyStack示例,使用LinkedList集合类实现一个先进先出的队列数据结构,可以往该结构中压入数据push()以及弹出数据pop(),并遵循先进入......
  • UES-10-增强数组
    创建数组Array.of()方法将接收的每个参数作为数组元素创建并返回数组。和Array构造器相比,用于函数参数更可靠。functioncreate(fun,value){returnfun(value);}letitems=create(Array.of,value);Array.of创建数组使用的是当前of()方法中的this,而不是Symb......
  • 【JAVASE】日期与时间类(上)
    一:概述从JAVASE8开始提供了java.time包,该包中有专门处理日期和时间的类。LocalDate  LocalDateTime  和LocalTime类的对象封装和日期、时间有关的数据,这三个类都是final类,而且不提供修改数据的方法,即这些类的对象的实体不可再发生变化,属于不可变对象。二:LocalDat......