冒泡排序:
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