I学霸官方免费教程二十八:Java排序算法之选择排序和冒泡排序

选择排序

步骤一、选取一组数据中起始位置(下标)上的数据,和其后的各个位置(下标)上数据进行比较;如果起始位置(下标)上的数据大(升序)或小(降序),就将两个位置上的数据进行交换;这样完成一轮比较之后,起始位置上的数据就是最小或最大了
步骤二、再次选取第二个位置上的数据,和其后各个位置上的数据进行比较。如此重复,就可将数据进行排序了。

实例:
package algorithm.sort;
/**
 * 演示选择排序算法
 * @author 学霸联盟 - 赵灿
 */
public class SelectionSortDemo {
	public static void main(String[] args) {
		//创建两个数组
		int[] arr1 = { 3, 5, 1, 4, 2 };
		/*
		 * 选择排序
		 * 顾名思义,从数组中按照顺序一个一个的选出来
		 * 升序排序:
		 * 第一步取出数组中下标为0的值,和后面每个值比较
		 * 如果小标为0值大于后面的值,则互换两个值,继续和后面的比
		 * 比完之后就可以保证下标为0的位置保持最小的值了
		 * 在取下标为1的值和后面的值一个一个比较,以此类推
		 */
		for (int i = 0; i < arr1.length - 1; i++) {
			//取到倒数第二个值即可,最后一个后面没有其他值了,也就无需比较了
			/*
			 * 内层循环拿后面的每一个值和外层循环取到的值比较
			 * 所以外层循环取下标为0处的值,这里第一次应该拿下标为1位置的值
			 * 外层循环取下标为1处的值,这里第一次应该拿下标为2位置的值
			 * 以此类推,得到j初始化时应该等于i+1
			 */
			for (int j = i+1; j < arr1.length; j++) {
				//判断大小
				if(arr1[i] > arr1[j]){
					//注意:这里交换的是数组中的值
					int temp = arr1[i];
					arr1[i] = arr1[j];
					arr1[j] = temp;
				}
			}
		}
		System.out.println("--- 选择排序法排序后 ---");
		for (int i = 0; i < arr1.length; i++) {
			System.out.print(arr1[i] + "  ");
		}
	}
}
运行结果:
--- 选择排序法排序后 ---
1  2  3  4  5

冒泡排序

步骤一:选取一组数据中起始位置(下标)上的数据,和第二个位置上的数据进行比较,如果起始位置(下标)上的数据大(升序)或小(降序),就将两个位置上的数据进行交换;然后使用第二个位置上的数据,和第三个位置上的数据进行比较;第三个和第四个...直至最后一个,这样完成一轮比较,就使最后一个位置上的数据最大或最小
步骤二:仍然是选取起始位置上的数据,和第二个位置上的数据进行比较,直至倒数第二个数据;
以此类推,直至只剩下第一个和第二个数据进行比较,比较完成后结束。

实例:
package algorithm.sort;
/**
 * 演示冒泡排序算法
 * @author 学霸联盟 - 赵灿
 */
public class BubbleSortDemo {
	public static void main(String[] args) {
		//创建两个数组
		int[] arr1 = { 3, 5, 1, 4, 2 };
		/*
		 * 冒泡排序
		 * 顾名思义,像冒泡一样,越往上越大
		 * 升序排序:
		 * 第一步取出数组中下标为0的值,和后面相邻的值比较
		 * 如果后面的值小,交换两个值(相当于向上冒一个位置)
		 * 交换后继续用这个大的值和后面的值进行比较
		 * 以此类推,第一遍比较完成后,最大的值就在最后一个下标位置了
		 */
		for (int i = arr1.length - 1; i > 0 ; i--) {
			//外层循环的作用是标识冒泡的结束位置,结束位置是依次向前移动的
			/*
			 * 每次都从第一个值开始往上冒泡
			 * 知道冒至外层循环标识的结束位置为止
			 */
			for (int j = 0; j < arr1.length - 1; j++) {
				//判断相邻两个值大小
				if(arr1[j] > arr1[j + 1]){
					//注意:这里交换的是数组中的值
					int temp = arr1[j];
					arr1[j] = arr1[j + 1];
					arr1[j + 1] = temp;
				}
			}
		}
		System.out.println("--- 冒泡排序法排序后 ---");
		for (int i = 0; i < arr1.length; i++) {
			System.out.print(arr1[i] + "  ");
		}
	}
}
运行结果:
--- 冒泡排序法排序后 ---
1  2  3  4  5

排序算法有很多很多,对于初学者,至少至少也要理解和熟练应用其中一种。

时间: 2024-10-26 04:43:44

I学霸官方免费教程二十八:Java排序算法之选择排序和冒泡排序的相关文章

I学霸官方免费教程二十六:Java基础教程之数组

数组 举例:假如现在有十个人排成一队[张三,李四,王五--],这个队的队名叫A,然后要求第一个人从0开始报数[张三报0,李四报1,王五报2--].现在要求第一个人出列,但现在还不知道张三的名字,怎么办?那么只能要求A队0号出列.请问此时谁会出列?很明显是张三出列.这对人就形成了类似数组的结构:其中队名A就对应数组名,各个人报的号就对应数组的下标,而每个人就对应数组中的元素,人的个数就对应数组的长度.在程序设计中,把具有相同类型的若干个变量按有序的形式组合在一起,仅使用一个变量名来存储这些元素,用

I学霸官方免费教程二十二:Java常用类之接收控制台输入 Scanner类

Scanner类(了解即可) 使用Scanner类接收键盘的输入1.创建Scanner对象的语法:Scanner scan = new Scanner(System.in);2.使用Scanner对象接收键盘输入:scan.next();//等待并接收键盘输入 实例: package common_class; import java.util.Scanner; /**  * 演示Scanner类  * 模拟用户登录  * @author 学霸联盟 - 赵灿  */ public class S

I学霸官方免费教程二十四:Java常用类之随机数 Math类和Random类

咱先了解即可 Math类:数学类,包括abs()求绝对值,sin()正弦函数,cos()余弦函数等等Random类:获取各种数据类型的随机数 实例: import java.util.Random; /**  * 演示获取随机数  * @author 学霸联盟 - 赵灿  */ public class MathDemo { public static void main(String[] args) { //创建Random对象 Random random = new Random(); //

I学霸官方免费教程二十五:Java基础教程之枚举 enum

枚举 枚举简单的说就是将需要的常量值一个一个的列举出来,并封装成一个整体.语法格式:[public] enum 枚举名{ //值列表 }声明格式:枚举名 变量名:赋值格式:变量名 = 枚举名.值其中的列举的每个值要符合标识符命名规则,不可随意编写 实例: package enumdemo.simple; /**  * 创建枚举类型的Week 注意:这里创建的是枚举,即数据类型是enum,而不是类  * @author 学霸联盟 - 赵灿  */ public enum Week { // 列举出

I学霸官方免费教程二十九:Java查找算法之二分法查找

二分法查找算法 基本步骤:    第一步:获取数组中间的下标    第二步:中间下标处的值和目标值比较,如果目标值大,说明要找的值在数组的后边一半中    第三步:再次获取数组右边一半的中间下标    第四步:再次用获得的中间下标和目标值进行比较    后续步骤以此类推,这样每次查找都在"半份"数据中进行,所以又叫折半查找.这也是为什么使用二分法查找之前必须要对数组进行排序的原因.如果不排序,将无法判断目标值在哪"半份"中 实例: package algorithm

I学霸官方免费教程三十八 :Java基础教程之异常

异常 程序中不正常的情况分为两大类:错误(Error)和异常(Exception) 错误(Error):程序本身无法对这种不正常的情况进行处理,将会导致程序崩溃:例如:内存耗尽错误,JVM崩溃错误等异常(Exception):程序可以特殊的代码,对不正常的情况进行捕获和处理,程序可以继续运行:例如:除零异常,空指针异常,数组下标越界异常 捕获异常 语法格式1: try{  //可能出现异常的代码   }catch(异常类 变量名){ //出现异常后的处理代码 //printStackTrace(

I学霸官方免费教程二十三:Java常用类之日期类 Date类 SimpleDateFormat类 Calendar类

Date 类 创建对象时,默认获取系统当前时间 SimpleDateFormat类 用来格式化日期的:创建对象是可以传入格式:new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");主要方法format(Date) Calendar类 可以使用SimpleDateFormat类中的getCalendar()方法获取对象.常用方法:get(int); 常用属性:YEAR MONTH... 实例: package common_class; import j

I学霸官方免费教程二十七:Java基础教程之Arrays类

Arrays类 数组的一个工具类,提供了一些静态的方法,用于操作数组:不多说,直接上例子 实例: //声明包 package array; //导入包 //作用:告诉系统,ArraysDemo类中用到Arrays类时去java.util包下找Arrays类 import java.util.Arrays; /**  * 演示Arrays类的常用方法  * @author 学霸联盟 - 赵灿  */ public class ArraysDemo { public static void main

I学霸官方免费教程三十:Java基础教程之泛型

泛型 先给大家举个例子:如现在有一家工厂,可以生产手机,也可以生产电脑.以后还可能生产其他产品.如果给某个工厂加上了泛型,就规定了这个工厂只能生产手机或电脑,不能再生产其他产品了. 实例: package generic; /**  * 产品枚举Product  * @author 学霸联盟 - 赵灿  */ public enum Product { 手机,电脑 } package generic; /**  * 手机类Phone  * @author 学霸联盟 - 赵灿  */ public