数组排序与查找

来源:互联网 发布:国外数据新闻案例分析 编辑:程序博客网 时间:2024/05/21 01:29

冒泡排序:

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次比较时范围为长度减一减ifor (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;}//当起始坐标大于结束坐标时,说明数组中找不到该元素,返回-1if(min>max){return -1;}}}// 冒泡排序 传入的是引用类型,不用设定返回值// 相邻元素两两比较交换,实现排序效果public static void MaoPao(int[] num) {// 元素进行对比的范围,因为是两两比较,需设置界限为长度减一,for (int i = 0; i < num.length - 1; i++) {// 设置单词对比的范围,在第i次比较时范围为长度减一减ifor (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));//二分查找  返回intSystem.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




0 0
原创粉丝点击