本文共 4227 字,大约阅读时间需要 14 分钟。
可以看这个网站(上面可以根据程序执行看到动画效果):
这个网站汇聚了各种算法,可以用程序和动画结合的方式学习,大家想详细理解算法,可以借助这个网站。冒泡排序算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序算法的运作如下:
import java.util.Arrays;public class Test { public static void main(String[] args) { int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8}; bubbleSort(values); System.out.println(Arrays.toString(values)); } public static void bubbleSort(int[] values) { int temp; for (int i = 0; i < values.length; i++) { for (int j = 0; j < values.length - 1 - i; j++) { if (values[j] > values[j + 1]) { temp = values[j]; values[j] = values[j + 1]; values[j + 1] = temp; } } } }}
其实,我们可以把冒泡排序的算法优化一下,基于冒泡排序的以下特点:
import java.util.Arrays;public class Test{ public static void main(String[ ] args) { int[ ] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8 }; bubbleSort(values); System.out.println(Arrays.toString(values)); } public static void bubbleSort(int[ ] values) { int temp; int i; // 外层循环:n个元素排序,则至多需要n-1趟循环 for (i = 0; i < values.length - 1; i++) { // 定义一个布尔类型的变量,标记数组是否已达到有序状态 boolean flag = true; /*内层循环:每一趟循环都从数列的前两个元素开始进行比较,比较到无序 数组的最后*/ for (int j = 0; j < values.length - 1 - i; j++) { // 如果前一个元素大于后一个元素,则交换两元素的值; if (values[j] > values[j + 1]) { temp = values[j]; values[j] = values[j + 1]; values[j + 1] = temp; //本趟发生了交换,表明该数组在本趟处于无序状态,需要继续比较; flag = false; } } //根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。 if (flag) { break; } } }}
选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
算法步骤import java.util.Arrays;public class Test{ public static void main(String[] args) { int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5, 8}; selectSort(values); System.out.println(Arrays.toString(values)); } public static void selectSort(int[] values){ for(int i=0;ivalues[j]){ min = j; } } if(min!=i) { int tmp = values[min]; values[min] = values[i]; values[i] = tmp; } } }}
二分法检索(binary search)又称折半检索,二分法检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值 key 与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功;
否则,若 key 小,则在数组前半部分中继续进行二分法检索;若 key 大,则在数组后半部分中继续进行二分法检索。 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。 二分法检索是一种效率较高的检索方法。比如,我们要在数组[7, 8, 9, 10, 12, 20, 30, 40, 50, 80, 100]中查询到 10 元素,过程如下:import java.util.Arrays;public class Test{ public static void main(String[] args) { int[] arr = { 30,20,50,10,80,9,7,12,100,40,8}; int searchWord = 20; // 所要查找的数 Arrays.sort(arr); //二分法查找之前,一定要对数组元素排序 System.out.println(Arrays.toString(arr)); System.out.println(searchWord+"元素的索引: "+binarySearch(arr,searchWord)); } public static int binarySearch(int[] array, int value){ int low = 0; int high = array.length - 1; while(low <= high){ int middle = (low + high) / 2; if(value == array[middle]){ return middle; //返回查询到的索引位置 } if(value > array[middle]){ low = middle + 1; } if(value < array[middle]){ high = middle - 1; } } return -1; //上面循环完毕,说明未找到,返回-1 }}
转载地址:http://zqpli.baihongyu.com/