数据结构与算法基础01—— 常见基本排序、二分法与异或运算
常见基本排序
选择排序
基本思路:从第一位开始标记,每次选出最小数字与标记位交换
代码实现:
冒泡排序
基本思路:每次比较相邻两个数大小,每次循环选出当轮最大/小数字,每次循环次数环比减一
代码实现:
插入排序
基本思路:保证前面有序的情况下,依次把后面数字插入到指定位置继续保证有序
代码实现:
二分法
基本思路:根据左右边界计算中间位置,中间值和目标值比较,如果中间值小于目标值,左边界等于中间位置+1,如果中间值大于目标值,右边界等于中间位置-1。
在一个有序数组中,找某个数是否存在
private static boolean isExist(int[] arr, int num) { if(arr == null || arr.length <2){ return false; } int L = 0; int R = arr.length-1; int mid = 0; while (L < R){ mid = L + ((R-L) >> 1); if(arr[mid] == num){ return true; }else if(arr[mid] < num){ L = mid + 1; }else{ R = mid - 1; } } return arr[L] == num; }
在一个有序数组中,找>=某个数最左侧的位置
在一个有序数组中,找<=某个数最右侧的位置
相邻两数不等,局部最小值问题
异或运算
基本规则:相同则0,不同则1
不用额外变量交换两个数
一个数组中有一种数出现奇数次,其他数都出现了偶数次,怎么找到并打印这种数
private static int getNum(int[] arr){ if(arr == null || 0 == arr.length){ return -1; } int num = 0; for (int i = 0; i < arr.length; i++) { num ^= arr[i]; } return num; }
一个数组中有两种数出现奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
数出二进制1的个数