13.1※[干货]、数组排序,冒泡排序、选择排序、正逆序折半二分查找法以及操作

※数组排序以及操作

int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };

--冒泡排序

//要是需要从大到小排序的话 就改一下if中的 < 改为 >即可实现从大到小排序 可以试试哟 qwq
//提示一下哟 不要数组查看数组的排序过程可以删除掉或者注释掉 只留结果就行
//记得导包哟 我这里使用了Arrays qwq

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

import java.util.Arrays;

/**
 *
 * @Author Lantzrung
 * @Date 2022年7月17日上午8:57:34
 * 
 **/
public class ArraySort {
	public static void main(String[] args) {
		int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };// 8个元素 但数组长度只有7位 因为数        
        //组是从0~7的
		// 1、进行n-1次冒泡 从大到小排序
		for (int i = 0; i < arr.length - 1; i++) {// 0~6冒泡 cause:n-1因为7-0 -->就是7位 
        //cause:最大的那个值已经确定所以剩下的继续进行冒泡即可
     
			// 2、每次冒泡进行n-1次比较
			for (int j = 0; j < arr.length - i - 1; j++) {
				// 用来查看交换前数组的位置、排序
				System.out.printf("i=%d,j=%d" + Arrays.toString(arr), i, j);// 交换前
				if (arr[j] < arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					// 用来查看交换后的数组位置、排序
					System.out.print("---->" + Arrays.toString(arr));// 交换后
				}
				System.out.println();
			}
		}
		// // foreach遍历输出arr数组结果 这里不建议使用foreach进行遍历
		// for (int i : arr) {
		// System.out.println(i);
		// }
		System.out.println("查看数组排列完的结果" + Arrays.toString(arr));
	}
}

--选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

1-2 1-3 1-4 ....

2-3~7

3-4~7

//要是需要从大到小排序的话 就改一下if中的 < 改为 >即可实现从大到小排序 可以试试哟 qwq
//提示一下哟 不要数组查看数组的排序过程可以删除掉或者注释掉 只留结果就行
//记得导包哟 我这里使用了Arrays qwq

import java.util.Arrays;

/**
 *
 * @Author Lantzrung
 * @Date 2022年7月17日上午10:56:33
 * 
 **/
public class ArraySortSelected {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 1、创建一个数组
		int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };
		// 2、进行n-1次选择【从小到大排序】 【i作起始位置】
		for (int i = 0; i < arr.length - 1; i++) { // 0~6选择
			// 定义一个变量i用来存储 执行了几次
			System.out.println("i=" + i);
			// 3、进行n-1次比较【i+1~arr.length-1】
			for (int j = i + 1; j < arr.length; j++) {
				// 用来查看交换前数组的位置、排序
				System.out.printf("i=%d,j=%d" + Arrays.toString(arr), i, j);// 交换前
				// 4、比较【当前位置的比后面的小则进行交换】
				if (arr[i] < arr[j]) {// 简称:走位qwq
					int temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
					// 用来查看交换后的数组位置、排序
					System.out.print("---->" + Arrays.toString(arr));// 交换后
				}
				// 换行
				System.out.println();
			}
		}
		System.out.println("查看数组排列完的结果" + Arrays.toString(arr));
	}
}

--选择排序的优化

import java.util.Arrays;
/**
 *
 * @Author Lantzrung
 * @Date 2022年7月17日上午9:56:34
 * 
 **/
public class ArraySortSelected01 {
	public static void main(String[] args) {
		// 1、创建一个数组
		int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };
		// 2、进行n-1次选择【从小到大排序】 【i作起始位置】
		for (int i = 0; i < arr.length - 1; i++) { // 0~6选择
			// 定义 一个变量来存储最大值的位置
			int index/* 索引 */ = i;
			System.out.println("i=" + i);
			// 3、进行n-1次比较【i+1~arr.length-1】
			for (int j = i + 1; j < arr.length; j++) {
				// 用来查看交换前数组的位置、排序
				System.out.printf("i=%d,j=%d" + Arrays.toString(arr), i, j);// 交换前
				// 4、比较【定义的起始位置的值比后面小,则保留索引位置】
				if (arr[index] < arr[j]) {// 简称:走位qwq
					index = j;
					// 用来查看交换后的数组位置、排序
					System.out.print("---->" + Arrays.toString(arr));// 交换后
				}
				System.out.println();
			}
			// 执行一次交换
			int temp = arr[index];
			arr[index] = arr[i];
			arr[i] = temp;
		}
		System.out.println("查看数组排列完的结果" + Arrays.toString(arr));
	}

}

--折半查找 + 冒泡排序(二分查找法)【前提数组要正序排序】 

[1, 5, 43, 45, 64, 65,99, 101, 978]

--先从数组中间开始找,如果查找的数>中间值,则在后面找;如果查找的数

--如果第一次找不到,则二分从后面(前面)的中间继续找,直到起始位置>结束位置就退出循环

要是需要从大到小排序的话 就改一下if中的 < 改为 >即可实现从大到小排序 可以试试哟 qwq
提示一下哟 不要数组查看数组的排序过程可以删除掉或者注释掉 只留结果就行
记得导包哟 我这里使用了Arrays qwq

import java.util.Arrays;
/**
*
* @Author Lantzrung
* @Date 2022年7月17日下午07:15:01
* 
**/
public class ArraysSort {
	public static void main(String[] args) {
		int arr[] = { 5, 101, 978, 43, 45, 64, 1, 65 };
		int key = 65;// 查找的🔑要查那个就输入那个数 这里我输入查找65
		// 1、先进行冒泡排序 使得数组正序排序  进行n-1次冒泡 从大到小排序
		for (int i = 0; i < arr.length - 1; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {// 0~6冒泡 cause:n-1因为7-0 --> 
            //就是从第7位开始计算冒泡排序,cause因为最大的那个值已经确定
                // 2、用来查看交换前数组的位置、排序
				System.out.printf("i=%d,j=%d" + Arrays.toString(arr), i, j);// 交换前
				if (arr[j] > arr[j + 1]) {
					int temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					// 用来查看交换后的数组位置、排序
					System.out.print("---->" + Arrays.toString(arr));// 交换后
				}
				System.out.println();
			}
		}
		//二分查找法
		System.out.println("查看数组排列完的结果" + Arrays.toString(arr));
		//3、定义一个中间索引的位置 start end
		int start = 0;//开始位置
		int end = arr.length - 1;//结束位置  需要数组长度-1
		int mid;// 索引
		boolean finded = false;// 提示找不找得到钥匙,则找不到输出-1
		//4、循环操作
		// 大循环
		while (start < end) {
			//5、计算索引值 计算中间索引   举例:3 7 -- > 7+3/2==5
			mid = (start + end) / 2;
			//6、判断{==} 判断开始等于结束输出索引
			if (key == arr[mid]) {
				System.out.println("索引值为:" + mid);
				finded = true;
				break;
				// 判断索引比钥匙大
			} else if (arr[mid] > key) {//6.1、判断(>) 中间索引值比key大 结束位置往前移动
				end = mid - 1;// 就是把结束值mid索引值往前走加大
			} else {// 6.2、判断(<) 中间索引值比key大   结束位置往后移动
				start = mid + 1;// 就是把开始值mid索引值往前走加大
			}
		}
		if (!finded) {// 如果索引没有找到则返回-1
			System.out.println("没有找到,返回值-1");
		}
	}
}

--数组工具类的使用

--数组工具类封装了数组的一些通用操作:

--排序(升序)

--复制(copyof)

--查找(二分查找法【必须要升序排序】)

--填充(fill)

--toString(转换为字符串)

/**
 *
 * @Author Lantzrung
 * @Date 2022年7月17日上午10:59:34
 * 
 **/

//输出结果输出为字符串
int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };
// System.out.println(arr);//输出地址值:[I@15db9742 无法打印字符串

// --排序(升序)
Arrays.sort(arr);// 正序排序
 
System.out.println(Arrays.toString(arr));// 将数组格式化为字符串 [1, 5, 43, 45, 64, 65, 101, 978]
// -- 复制(copyof) copyOfRange[范围复制]
// int[] arr_copy = Arrays.copyOf(arr_copy);
// System.out.println(Arrays.toString(arr_copy);
int[] arr_cpoy = Arrays.copyOfRange(arr, 1, 5);
System.out.println(Arrays.toString(arr_cpoy));
// -- 查找 (binarySearch二分查找法【必须要升序排序】)【约束范围】
System.out.println(Arrays.binarySearch(arr, 165));
System.out.println(Arrays.binarySearch(arr, 1, 6, 65));
// - - 填充(fill)
// Arrays.fill(arr,110);
// Arrays.fill(arr,1,3,110);
// System.out.println(Arrays.toString(arr));
// Arrays.//重载方法
// 比较[长度、大小、排序]
int[] arritem = { 1, 5, 43, 45, 64, 65, 978, 101 };
System.out.println(Arrays.equals(arr, arritem));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lantzruk

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值