1.冒泡排序:
思路分析:
数组中 第一个空间值和第二个空间值比较,把较大的值存在第二个空间中。第二个空间值和第三个空间值比较,把较大的值存在第三个空间中。依次类推,把最大值存放在最后一个空间中。
因为已经找到最大的值了,所以再一次循环就要找到倒数第二大的值存放在倒数第二个空间。
代码演示:
import java.util.Arrays; public class MaoPao { public static void main(String[] args) { int[] arr={2,6,85,95,3,2,54,1}; bubbleSort(arr); } 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; } } } System.out.println(Arrays.toString(arr)); } }
2.选择排序
思路分析:
算法原则(从小到大):先用数组第一个空间值和数组其他空间值依次作比较,如果找到比第一个空间值小的就把第一个值和当前值进行调换。依次比较完所有的内容,第一个空间值存放的一定是最小值。第一值比较完,在进行类推。比较完数组的所有位置。
使用空间找空间中需要的元素,外循环推进的是位置,内循环是当前位置之后的每一位。
代码演示:
import java.util.Arrays; public class XuanZe { public static void main(String[] args) { int[] arr={2,96,3,56,8,7,9}; selectSort(arr); } public static void selectSort(int[] arr){ // 提供比较空间的角标 for(int i=0;i<arr.length-1;i++){ // 提供剩余空间的角标 for(int j=i+1;j<arr.length;j++){ // i对应的值不是最小的 if(arr[i]>arr[j]){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } System.out.println(Arrays.toString(arr)); } }
3.一般查找
思路分析:
从数组中 第一个空间 开始查找,每次取出一个空间值进行比较,找到相等元素对应的角标;若遍历整个数组没有找到目标元素,则返回-1。
代码演示:
public class Chazhao { public static void main(String[] args) { int[] arr={2,85,65,74,96,32,33}; System.out.println(searchKey(arr,32)); } public static int searchKey(int[] arr,int value){ // 遍历查找 for (int i = 0; i < arr.length; i++){ if (value == arr[i]) return i;// 找到目标元素 } return -1;// 完全遍历后,仍然没结果。 } }
4.二分查找
思路分析:
找到中间角标对应的值。
让该元素和要找的值进行比较。
如果要找的数字大了,缩小范围。要找的范围是:中间角标+1 到 尾角标。反之,在头角标 到 中间角标-1
不断重复,直到找到目标。
代码演示:
public class Demo05 { public static int binarySearch(int []arr,int value){ // 定义变量存放最大角标 最小角标 中位角标 int max,min,mid; min = 0; max = arr.length-1; mid = (min+max)>>1; while (arr[mid]!=value){ if (value>arr[mid]){// 在右侧区域 min = mid + 1; } else if(value<arr[mid]){// 在左侧区域 max = mid - 1; } if(max<min){// 遍历结束 return -1; } mid = (min+max)>>1;// 再次二分 } return mid;// 目标角标 } }