数组相关算法(冒泡排序、选择排序、二分查找)
1、冒泡排序
冒泡由小到大排序思路:从前向后进行两两比较,如果前面的数大于后面的数就交换。
package cn.lwj0126.javase.array.test; //冒泡排序 public class BubbleSorting { public static void main(String[] args) { int[] data = {77,44,66,33,55,11}; for (int x=0; x < data.length-1; x++) { //对于 n 个数的数组,需要比较 n-1 轮 for (int j = 0; j < data.length-1-x; j++) { if (data[j] > data[j+1]) { int t = data[j]; data[j] = data[j+1]; data[j+1] = t; } } } //打印结果 for (int a : data) { System.out.print(a+"\t"); } } }
输出结果:11 33 44 55 66 77
2、选择排序
选择由小到大排序思路:从当前的数中选择最小的交换到前面。
package cn.lwj0126.javase.array.test; //选择排序:找出每轮最小的交换到前面 public class SelectionSorting { public static void main(String[] args) { int[] data = {77,44,66,33,55,11}; selectionSort(data); for (int a : data ) { System.out.print(a+"\t"); } } public static void selectionSort(int[] data){ for (int i = 0; i < data.length-1; i++) {//有n个数的数组,进行n-1轮选择 int index = i; //最小元素的下标 for (int j = i; j < data.length-1; j++) { if (data[j] > data[j+1]){ index = j+1; } } swap(data , i , index); } } public static void swap(int[] data , int i , int index){ int temp = data[i]; data[i] = data[index]; data[index] = temp; } } 执行结果:11 33 44 55 66 77
3、二分查找
二分查找的前提是数组已经由小到大排序。二分查找思路是始终与中间的元素比较大小,如果要查找的元素小于中间数,查找范围缩小到左一半;如果要查找的元素比中间的元素大,把查找范围缩小到右一半。
不会写?java.util.Arrays 类已提供了 binarySearch(int[] a, int key) 方法,在 a数组中采用二分查找,返回 key元素的索引值。
package cn.lwj0126.javase.array.test; import java.util.Arrays; public class BinarySeaching { public static void main(String[] args) { int[] data = {11,77,33,44,22,66}; Arrays.sort(data); //数组排序,升序 System.out.println("排序后:" + Arrays.toString(data)); int a = binarySeach(data,33); //比如查找33 if (a == -1) System.out.println("没找到"); else System.out.println("索引位置:" + a); } public static int binarySeach(int[] data , int key){ int from = 0; int end = data.length-1; while(from <= end){ int mid = (from + end) / 2; if (key == data[mid]) //正好中间 return mid; else if(key < data[mid]) //中间偏左 end = mid - 1; else //中间偏右 from = mid + 1; } return -1; } } 执行结果: 排序后:[11, 22, 33, 44, 66, 77] 索引位置:2