排序&二分查找
来源:互联网 发布:长戟大兜虫淘宝 编辑:程序博客网 时间:2024/06/04 00:50
二分查找
二分查找算法也称为折半搜索、二分搜索
在有序数组中查找某指定元素的搜索算法。企业面试常见考试的类型。
* 有序:二分查找法只适用于有序的数组,对于无序的数组如果想要使用二分查找法查找某数据,必须先对目标数组进行排序。
- 原理:二分查找法,即对一个有序的数组每次取数组中间下标的数据与目标key值进行比较,快速缩小查找范围。
/** * 6,8,10,12,14,16,18,20--midVal = 12 > key * 6,8,10 --midVal = 8 < key * 10 --midVal = 10 ==key 查找成功 */public class Test01_BinarySearch { public static void main(String[] args) { int[] a = {6,8,10,12,14,16,18,20};// 测试数组 int key = 10;// 目标key值 int index = binarySearch(a,key);// 使用我们写的二分查找法进行查找 System.out.println("binarySearch:"+key+" index:"+index); int arrays = Arrays.binarySearch(a, key);// 调用Java官方提供的二分查找法查找数据 System.out.println("Arrays:"+key+" index:"+arrays); } private static int binarySearch(int[] a, int key) { int low = 0;// 记录最小下标 int high = a.length-1;// 记录最大下标 while(low <= high){// 当low > high时说明数组中没有查找的key值 int mid = (low+high) >>> 1;// 计算中间下标 int midVal = a[mid];// 取得中间下标对应的值 if(midVal > key){// 将中间值与目标key值进行比较 high = mid-1;// 查找范围减半 }else if(midVal < key){ low = mid+1; }else{ return mid; } } return -1;// 查找数据不存在 }}
排序
排序是计算机程序设计中的一种重要操作,是指将一个任意的序列,排列成一个关键字有序的序列。
选择排序
- 原理:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
public class Test02_SelectSort { public static void main(String[] args) { int[] a = new int[10]; Random random = new Random(); for(int i=0;i<a.length;i++){ a[i] = random.nextInt(100); }// 利用随机数产生一个随机数组 System.out.println(Arrays.toString(a)); selectSort(a);// 排序 System.out.println(Arrays.toString(a)); } // 选择排序,降序 static void selectSort(int[] a){ for(int i=0;i<a.length;i++){// 外层循环每一趟完成一个位置上数据的排序 // 内层循环将该位置上的元素与其他所有元素进行比较,确定该位置上的元素,如第一次找到最大值放在第一个 for(int j=i+1;j<a.length;j++){ if(a[j]>a[i]){// 如果有元素大于该位置上的元素,就交换两个元素 int t = a[i]; a[i] = a[j]; a[j] = t; } } } } }
冒泡排序
- 原理:依次比较相邻的两个数,将小数放在前面,大数放在后面。升序
public class Test03_BubbleSort { public static void main(String[] args) { int[] a = new int[10]; Random random = new Random(); for(int i=0;i<a.length;i++){ a[i] = random.nextInt(101); } System.out.println(Arrays.toString(a)); bubbleSort(a); System.out.println(Arrays.toString(a)); } // 冒泡排序 static void bubbleSort(int[] a){ for(int i=1;i<a.length;i++){ for(int j=0;j<a.length-i;j++){// 内层循环循环一次选出一个最大的数放在数组最后 if(a[j] > a[j+1]){ int t = a[j]; a[j] = a[j+1]; a[j+1] = t; } } } }}
插入排序
- 原理:将数据插入到已经排好序的有序数据中,得到一个新的、个数加一的有序数据。
public class Test04_InsertSort { public static void main(String[] args) { int[] a = new int[10]; Random random = new Random(); for (int i = 0; i < a.length; i++) { a[i] = random.nextInt(101); } System.out.println(Arrays.toString(a)); insertSort(a); System.out.println(Arrays.toString(a)); } static void insertSort(int[] a) { for (int i = 1; i < a.length; i++) { int k = a[i]; int j; for (j = i - 1; j >= 0 && k > a[j]; j--) { a[j + 1] = a[j]; } a[j + 1] = k; } }}
快速排序
快速排序的过程是首先选择一个基准,如下标为0的数值。先从后往前找一个比基准大的数,然后将此数值与基准交换,再从前往后找一个比基准小的数值,然后在将此小数值与基准交换。如此反复…
- 原理:快速排序使用分治法来设计算法:取一个基准元素,拆分之后基准元素左边的都比基准元素大,右边的元素都比基准元素小,然后分别对两个子数组排序。降序
public class Test05_QuickSort { public static void main(String[] args) { int[] a = new int[10]; Random random = new Random(); for(int i=0;i<a.length;i++){ a[i] = random.nextInt(100); } System.out.println(Arrays.toString(a)); quickSort(a,0,a.length-1); System.out.println(Arrays.toString(a)); } private static void quickSort(int[] a, int low, int high) { if(low>=high){// 递归的中止条件 return; } int l = low; int h = high; boolean isRight = false; while(l < h){ if(a[l] < a[h]){ int t = a[l]; a[l] = a[h]; a[h] = t; isRight = !isRight; } if(isRight){ l++; }else{ h--; } } quickSort(a,low,l-1);// 对子数组进行排序 quickSort(a,l+1,high); }}
0 0
- 二分排序与二分查找
- 二分排序与二分查找
- 二分排序与二分查找
- 二分查找和二分排序
- 二分查找折半查找排序
- 冒泡排序+二分查找
- 冒泡排序、二分查找
- 排序算法-二分查找
- 二分查找插入排序
- 二分查找插入排序
- 快速排序+二分查找
- 二分查找排序
- 插入排序 二分查找
- 排序:二分查找
- 二分查找插入排序
- 二分排序和查找
- javascript 二分查找排序
- 排序&二分查找
- 用递归方法求解(2)
- git merge
- hdu4454Stealing a Cake+计算几何
- 用递归方法求解(3)
- ScrollView嵌套ListView,GridView,ViewPager,以及这些控件自动滚动到底部问题的解决
- 排序&二分查找
- 深入浅出单实例Singleton设计模式
- lightoj-【1138 - Trailing Zeroes (III)】
- Java内存垃圾回收
- Light-oj-1282 Leading and Trailing(数学取位)
- 大数据时代的数据存储,非关系型数据库MongoDB
- Android设备rfid—lib文夹下的armeabi-v7a armeabi arm64-v8a
- Mysql from 子查询问题? 随笔
- 通过通知打开一个Activity时保留导航