数组排序与查找

冒泡排序:

public class Test {
	public static void main(String[] args) {
		int[] num = { 23, 71, 49, 52, 81, 40, 11 };
		int[] num2 = { 99, 88, 77, 66, 55, 44, 33, 22, 11 };

		/*
		 * for (int i = 0; i < num.length-1; i++) { for (int j = 0; j <
		 * num.length - i-1; j++) { int temp = 0; if (num[j] > num[j + 1]) {
		 * temp = num[j]; num[j] = num[j + 1]; num[j + 1] = temp; } } }
		 */
		System.out.println("排序前:");
		Show(num);
		MaoPao(num);
		System.out.println("排序后:");
		Show(num);

		System.out.println("排序前:");
		Show(num2);
		MaoPao(num2);
		System.out.println("排序后:");
		Show(num2);
	}

	// 遍历数组
	public static void Show(int[] num) {
		// 先输出一个左括号
		System.out.print("[");
		for (int i = 0; i < num.length; i++) {
			// 如果是最后一个元素就直接输出
			if (i == num.length - 1) {
				System.out.print(num[i]);
			} else {
				// 如果不是,输出元素后追加逗号和空格
				System.out.print(num[i] + ", ");
			}
		}
		// 输出又括号
		System.out.println("]");
	}

	// 冒泡排序 传入的是引用类型,不用设定返回值
	// 相邻元素两两比较交换,实现排序效果
	public static void MaoPao(int[] num) {
		// 元素进行对比的范围,因为是两两比较,需设置界限为长度减一,
		for (int i = 0; i < num.length - 1; i++) {
			// 设置单词对比的范围,在第i次比较时范围为长度减一减i
			for (int j = 0; j < num.length - i - 1; j++) {
				int temp = 0;
				// 如果前一个大于后一个就交换
				if (num[j] > num[j + 1]) {
					temp = num[j];
					num[j] = num[j + 1];
					num[j + 1] = temp;
				}
			}
		}
	}
}

输出:

排序前:

[23, 71, 49, 52, 81, 40, 11]

排序后:

[11, 23, 40, 49, 52, 71, 81]

排序前:

[99, 88, 77, 66, 55, 44, 33, 22, 11]

排序后:

[11, 22, 33, 44, 55, 66, 77, 88, 99]


选择排序:

public class Test {
	public static void main(String[] args) {
		int[] num = { 23, 71, 49, 52, 81, 40, 11 };
		int[] num2 = { 99, 88, 77, 66, 55, 44, 33, 22, 11 };
		System.out.println("排序前:");
		Show(num);
		XuanZe(num);
		System.out.println("排序后:");
		Show(num);

		System.out.println("排序前:");
		Show(num2);
		XuanZe(num2);
		System.out.println("排序后:");
		Show(num2);
	}

	// 遍历数组
	public static void Show(int[] num) {
		// 先输出一个左括号
		System.out.print("[");
		for (int i = 0; i < num.length; i++) {
			// 如果是最后一个元素就直接输出
			if (i == num.length - 1) {
				System.out.print(num[i]);
			} else {
				// 如果不是,输出元素后追加逗号和空格
				System.out.print(num[i] + ", ");
			}
		}
		// 输出又括号
		System.out.println("]");
	}
	
	// 选择排序法
	public static void XuanZe(int[] num) {
		// 外循环次数为总数减一,拿出一个元素,待比较的元素数为总数减一
		for (int i = 0; i < num.length - 1; i++) {
			// 由于每次排序后最小的值已经在最前,
			// 所以从已定元素的标号往后开始循环比较
			// 例如num【0】和之后每个对比如果比后者大就立即交换位置
			for (int j = i + 1; j < num.length; j++) {
				int temp = num[0];
				if (num[i] > num[j]) {
					temp = num[i];
					num[i] = num[j];
					num[j] = temp;
				}
			}
		}
	}
}

输出:

排序前:

[23, 71, 49, 52, 81, 40, 11]

排序后:

[11, 23, 40, 49, 52, 71, 81]

排序前:

[99, 88, 77, 66, 55, 44, 33, 22, 11]

排序后:

[11, 22, 33, 44, 55, 66, 77, 88, 99]


练习:字符串排序

public class Test {
	public static void main(String[] args) {
	String s = "asdfghjkl";
		char[] ch = s.toCharArray();
		System.out.println("排序前:");
		System.out.println(s);
		XuanZe(ch);
		System.out.println("排序后:");
		System.out.println(String.valueOf(ch));
	}
	// 重载方法接收char【】 参数
	public static void XuanZe(char[] num) {
		// 外循环次数为总数减一,拿出一个元素,待比较的元素数为总数减一
		for (int i = 0; i < num.length - 1; i++) {
			// 由于每次排序后最小的值已经在最前,
			// 所以从已定元素的标号往后开始循环比较
			// 例如num【0】和之后每个对比如果比后者大就立即交换位置
			for (int j = i + 1; j < num.length; j++) {
				char temp = num[0];
				if (num[i] > num[j]) {
					temp = num[i];
					num[i] = num[j];
					num[j] = temp;
				}
			}
		}
	}
}	

输出:

排序前:

asdfghjkl

排序后:

adfghjkls


数组查找:


二分查找:

public class Test {
	public static void main(String[] args) {
		int[] arr = { 23, 65, 48, 71, 33, 10, 61, 29, 73, 40 };
		int n = 48;
		System.out.println("原数组:");
		Show(arr);
		MaoPao(arr);
		System.out.println("排序后的数组:");
		Show(arr);
		int m = Search(n, arr);
		System.out.println("数字" + n + "在数组中出现的位置为:" + m);
	}

	// 二分查找
	// 需先将数组排序,以有小到大排序为例
	//传入待查值和数组,返回查到的坐标
	public static int Search(int n, int[] arr) {
		// 定义一个查找范围的起始坐标
		int min = 0;
		// 定义一个查找范围的结束坐标
		int max = arr.length - 1;
		// 中间值坐标
		int mid = (min + max) / 2;
		// 循环查询
		while (true) {
			// 如果待查的值与查询的坐标对应的值相同就返回该坐标
			if (n == arr[mid]) {
				return mid;
				// 如果待查值比查到的数字大,说明对应的坐标靠后
			} else if (n > arr[mid]) {
				// 起始坐标变为上一次中间值加一,结束坐标不变
				// 中间坐标更新
				min = mid + 1;
				mid = (min + max) / 2;
				// 如果待查值比查询的坐标对应的值小,说明对应的坐标靠前
			} else {
				// 结尾坐标变为上一次的中间值并减一,起始坐标不变
				max = mid - 1;
				// 更新中间坐标
				mid = (min + max) / 2;
			}
			//当起始坐标大于结束坐标时,说明数组中找不到该元素,返回-1
			if(min>max){
				return -1;
			}
		}
	}

	// 冒泡排序 传入的是引用类型,不用设定返回值
	// 相邻元素两两比较交换,实现排序效果
	public static void MaoPao(int[] num) {
		// 元素进行对比的范围,因为是两两比较,需设置界限为长度减一,
		for (int i = 0; i < num.length - 1; i++) {
			// 设置单词对比的范围,在第i次比较时范围为长度减一减i
			for (int j = 0; j < num.length - i - 1; j++) {
				int temp = 0;
				// 如果前一个大于后一个就交换
				if (num[j] > num[j + 1]) {
					temp = num[j];
					num[j] = num[j + 1];
					num[j + 1] = temp;
				}
			}
		}
	}

	// 遍历数组
	public static void Show(int[] num) {
		// 先输出一个左括号
		System.out.print("[");
		for (int i = 0; i < num.length; i++) {
			// 如果是最后一个元素就直接输出
			if (i == num.length - 1) {
				System.out.print(num[i]);
			} else {
				// 如果不是,输出元素后追加逗号和空格
				System.out.print(num[i] + ", ");
			}
		}
		// 输出又括号
		System.out.println("]");
	}
}

输出:

原数组:

[23, 65, 48, 71, 33, 10, 61, 29, 73, 40]

排序后的数组:

[10, 23, 29, 33, 40, 48, 61, 65, 71, 73]

数字48在数组中出现的位置为:5


**如果初始数组为无序的,不可用二分查找,因为排序过程数组元素已经发生改变,只能使用基本查找**方法。



Arrays工具类

    A:是针对数组进行操作的工具类。包括排序和查找等功能。

B:要掌握的方法(自己补齐方法)

把数组转成字符串:

排序:

二分查找:

//导包
import java.util.Arrays;

public class Test {
	public static void main(String[] args) {
		int[] arr = { 23, 65, 48, 71, 33, 10, 61, 29, 73, 40 };
		//Arrays.toString(int[] arr),将数组转换成字符串
		System.out.println("排序前:"+Arrays.toString(arr));
		//Arrays.sort(int[] arr),数组排序
		Arrays.sort(arr);
		System.out.println("排序后:"+Arrays.toString(arr));
		//二分查找  返回int
		System.out.println(Arrays.binarySearch(arr, 48));
	}

}

输出:

排序前:[23, 65, 48, 71, 33, 10, 61, 29, 73, 40]

排序后:[10, 23, 29, 33, 40, 48, 61, 65, 71, 73]

5




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值