快速排序
public static void quickSort(int arr[],int l,int r) {
//待排元素为一个或没有时 直接反回
if (l >= r) return;
//初始化两端指针 选取中间元素作为比较值
int i = l - 1,j = r + 1,x = arr[l+r>>1];
//两端指针相遇时跳出循环
while(i < j) {
do i++; while (arr[i] < x);//小于比较值时向前推进
do j--; while (arr[j] > x);//大于比较值时向前推进
//两个指针都停下后交换两端元素
if (i < j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//递归排列由比较值分割后的两个部分的元素
quickSort(arr, l, j);
quickSort(arr, j+1, r);
//排序完成
}
归并排序
public static void mergeSort(int [] arr,int l,int r) {
//待排元素为一个或没有时 直接反回
if (l >= r) return;
//确定中点值
int mid = l+r>>1;
//递归排列由中点值分割后的两个部分的元素
mergeSort(arr, l, mid);
mergeSort(arr, mid+1, r);
//合并排列好的两个部分的元素
//i为左边部分第一个元素的起始下标 j为右边部分第一个元素的起始下标
int i = l,j = mid+1,k = 0;
//合并左右两部分的元素当有一遍的元素已经合并完时跳出循环
while(i<=mid&&j<=r) {
//左右两边当前指针指向元素进行比较
//将比较小的优先放入临时存储数组temp 放入后同时指针向后移动一位
if (arr[i]<=arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
//将没遍历完的那一边的剩余元素顺序加入到当前temp数组的后面
while(i<=mid) temp[k++] = arr[i++];
while(j<=r) temp[k++] = arr[j++];
//将temp数组中排序好的l-r位置的元素写入到原数组的l-r位置
for (i = l,j = 0; i <= r; i++,j++) arr[i] = temp[j];
//排序完成
}
整数二分查找
//二分查找左边界位置
public static int BS_left(int x) {
//确定查找的起始结束位置
int l = 0,r = n-1;
//当起始位置重合时查找结束 跳出循环
while(l<r) {
//确定当前查找范围的中点
int mid = l+r>>1;
//当目标值x处于起始位置l到中点mid的范围中时
if (arr[mid]>=x) r = mid;//将查找的结束位置更新为mid
//当目标值x处于中点mid到结束位置r的范围中时(不包括mid)
else l = mid + 1;//将查找的起始位置更新为mid+1
}
//若查找的边界对应的值不为目标值 表示目标值不存在 返回-1
if (arr[l]!=x) return -1;
//目标值存在 返回对应的左边界的位置
else return l;
}
//二分查找右边界位置
public static int BS_right(int x) {
//确定查找的起始结束位置
int l = 0,r = n-1;
//当起始位置重合时查找结束 跳出循环
while(l<r) {
//确定当前查找范围的中点(查找右边界mid值需要加1 防止死循环)
int mid = l+r+1>>1;
//当目标值x处于中点mid到结束位置r的范围中时
if (arr[mid]<=x) l = mid;//将查找的起始位置更新为mid
//当目标值x处于起始点l到中点mid的范围中时(不包括mid)
else r = mid - 1;//将查找的结束位置更新为mid-1
}
//若查找的边界对应的值不为目标值 表示目标值不存在 返回-1
if (arr[l]!=x) return -1;
//目标值存在 返回对应的右边界的位置
else return l;
}
浮点数二分查找
public static double BS(double n) {
//确定查找的起始结束位置
double l = 0,r = n;
//当起始位置与结束位置缩小到一个小范围时 跳出循环
while(Math.abs(l-r)>1e-8) {
//确定当前查找范围的中点
double mid = (l+r)/2;
//判断中点相关的条件进行对应边界的缩小
//浮点数可以直接对起始位置赋值为mid 无需加1或减1
//因为没有整数运算中取整带来的误差
if (check(mid)) r = mid;
else l = mid;
}
//缩小到一定范围后取起始位置或结束位置都可以作为最终查找的值
return l;
}