2、数组排序 冒泡排序: A: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 B: 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 C: 针对所有的元素重复以上的步骤,除了最后一个。 D: 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 public static void bubbleSort(int[] arr) { // 外循环控制比较的次数 for (int i = 0; i < arr.length - 1; i++) { // 内循环控制每次比较中,元素两两比较的过程。每次需要比较的数据是逐渐减少的。 for (int j = 0; j < arr.length - 1 - i; j++) { // 比较相邻元素,如果前面的大,进行交换 if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } 选择排序: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 每次比较仅做一次交换。 public static void selectionSort(int[] arr) { // 外循环控制比较的次数 for (int i = 0; i < arr.length - 1; i++) { // 定义变量,用于记录每次比较中最小值的索引 int mark; // 内循环控制每次比较中,元素比较的过程。每次需要比较的数据是逐渐减少的。 for (int j = i + 1; j < arr.length; j++) { mark = i; if (arr[mark] > arr[j]) { mark = j; } // 判断,如果最小值不是每次比较时的第一个,将这个最小值交换到每次比较的起始索引处。 if (mark != i) { int temp = arr; arr = arr[mark]; arr[mark] = temp; } } } } 练习:对字符串中字符进行自然排序。 思路: A:把字符串转换成字符数组。 B:对字符数组进行排序。 C:把排序后的字符数组转换成字符串。 // main method main { String s = "basckd"; // A: char[] chs = s.toCharArray(); // B: bubbleSort(chs); // C: String result = new String(chs); // String.copyValueOf(); // String.valueOf(); } // 排序方法(采用冒泡排序) public static void bubbleSort(char[] chs) { for (int i = 0; i < chs.length - 1; i++) { for (int j = 0; j < chs.length - 1 - i; j++) { if (chs[j] > chs[j + 1]) { char temp = chs[j]; chs[j] = chs[j + 1]; chs[j + 1] = temp; } } } } 3、数组查找。 问题提出: 已知int[] arr = {37, 92, 54, 18, 76}; 求元素92索引是多少? 普通查找:遍历数组,把数组中的元素与给定的值依次进行比较,一旦查找到,返回该元素索引,如果没有,返回-1. public static void commonSearch(int[] arr, int target) { for (int i = 0; i < arr.length; i++) { if (arr == target) { return i; } } return -1; } 思考:效率问题。如果数组较大,想查找的元素位于数组索引较大处,要将数组全部遍历才能找到。
|