数组冒泡排序
public class ArrayTest01 { public static void main(String[] args) { int[] arr = {3, 5, 1, 7, 6, 2, 4}; // 外侧循环:用于控制比较的躺数 for(int i = 0; i < arr.length - 1; i++) { // 在每一趟判断以前,先假设本趟排序已经完成 boolean flag = true; // 内侧循环:用于控制每一趟相邻元素比较的次数 for(int j = 0; j < arr.length - i - 1; j++) { // 相邻两个元素作比较,若是前一个大于后一个,则交换位置 if(arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; // 进入此处,证实本趟排序还未完成,因此推翻假设 flag = false; } } System.out.print("第" + (i+1) + "次排序:"); for(int value : arr) { System.out.print(value + " "); } System.out.println(); // 最后判断flag标记的值,从而肯定排序是否已经完成 if(flag) { break; // 跳出外侧循环 } } System.out.print("排序完成:"); for(int value : arr) { System.out.print(value + " "); } } }
冒泡排序java
工做原理:重复地走访过要排序的数列,一次比较两个元素,若是他们的顺序错误就把他们交换过来。走访数列的工做是重复地进行直到没有再须要交换,也就是说该数列已经排序完成。算法
这个算法的名字由来是由于越大的元素会经由交换慢慢“浮”到数列的顶端,故名。数组
ublic class ArrayTest02 { public static void main(String[] args) { int[] arr = {3, 5, 1, 7, 6, 2, 4}; sort(arr); System.out.print("排序完成:"); for(int value : arr) { System.out.print(value + " "); } } /** * 冒泡排序(升序) * @param arr 须要排序的数组 */ public static void sort(int[] arr) { // 外侧循环:用于控制比较的躺数 for(int i = 0; i < arr.length - 1; i++) { // 在每一趟判断以前,先假设本趟排序已经完成 boolean flag = true; // 内侧循环:用于控制每一趟相邻元素比较的次数 for(int j = 0; j < arr.length - i - 1; j++) { // 相邻两个元素作比较,若是前一个大于后一个,则交换位置 if(arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; // 进入此处,证实本趟排序还未完成,因此推翻假设 flag = false; } } // 最后判断flag标记的值,从而肯定排序是否已经完成 if(flag) { break; // 跳出外侧循环 } } } }
二分法查找
二分查找又称折半查找性能
优势:比较次数少,查找速度快,平均性能好;code
缺点:是要求待查表为有序表,且插入删除困难。blog
所以,折半查找方法适用于不常常变更而查找频繁的有序列表。排序
前提:必须是有序的数组。索引
例题:获取元素12在数组{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}中的索引。class
public class ArrayTest03 { public static void main(String[] args) { int[] arr = {0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}; // 定义须要查找的元素 int value = 12; int index = binarySearch(arr, value); System.out.println(index); } /** * 折半查找 * @param arr 须要查找的数组 * @param value 须要查找的元素 * @return 返回查找到的元素索引,若是没找到则返回-1 */ public static int binarySearch(int[] arr, int value) { // 定义三个变量 int min = 0, max = arr.length - 1, mid; // 经过死循环执行二分查找 while (true) { // 更新mid的值 mid = (min + max) / 2; // 判断arr[mid]和value的值 if (arr[mid] > value) { max = mid - 1; } else if (arr[mid] < value) { min = mid + 1; } else { return mid; } // 若是max小于min,则证实value在数组中不存在 if (max < min) { return -1; } } } }