• 基础算法(一)


    目录

    一.排序

    快速排序:

    归并排序:

    二.二分法

    整数二分模板:

    浮点二分:


     

    一.排序

    快速排序:

    • 从数列中挑出一个元素,称为 "基准"
    • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作。
    • 递归把小于基准值元素的子数列和大于基准值元素的子数列排序。b82c44d46c39475c912134a9b9ab43c0.gif
    1. static void quick_sort(int[] arr,int l,int r){
    2. if (l>=r) return;//特判小于等于1个的数组
    3. int x=arr[(l+r)>>1],i=l-1,j=r+1;//取分隔基准
    4. while (i//把小于x的数放左边,大于x的数放右边
    5. //跳过已符合条件
    6. do i++; while (arr[i]
    7. do j--; while (arr[j]>x);
    8. //交换使符合条件
    9. if (i
    10. int t=arr[i];
    11. arr[i]=arr[j];
    12. arr[j]=t;
    13. }
    14. }
    15. //递归左右边排序
    16. quick_sort(arr,l,j);
    17. quick_sort(arr,j+1,r);
    18. }

    归并排序:

    利用归并(先递归排序子元素,再合并)的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

    5fd175ece4ab4069b3786b8647001d27.gif

     

    1. static void merge_sort(int[] arr, int l, int r) {
    2. if (l >= r) return;
    3. int mid = l + r >> 1;
    4. merge_sort(arr, l, mid);//递归排序左
    5. merge_sort(arr, mid + 1, r);//右
    6. //合并
    7. int[] tmp = new int[arr.length];
    8. int k = 0, i = l, j = mid + 1;
    9. while (i <= mid && j <= r) {//从排序好的左右数组取最小依次放入tmp数组,知道某一个数组取完
    10. if (arr[i] < arr[j])
    11. tmp[k++] = arr[i++];
    12. else
    13. tmp[k++] = arr[j++];
    14. }
    15. //剩余部分直接放入tmp数组末尾
    16. while (i <= mid) tmp[k++] = arr[i++];
    17. while (j <= r) tmp[k++] = arr[j++];
    18. //tmp数组赋给原数组
    19. for (i = l, j = 0; i <= r; i++, j++) arr[i] = tmp[j];
    20. }

    二.二分法

    二分法的思想很简单,因为整个数组是单调的,每次判断后可将另外一半直接排除,大大提高查找效率,但是二分查找的边界问题很容易成为问题

    整数二分模板:

    1. static int binary_search1(int[] arr,int l, int r){
    2. while (l
    3. int mid=l+r>>1;
    4. if (check(mid)){
    5. r=mid;
    6. }else {
    7. l=mid+1;
    8. }
    9. }
    10. return l;
    11. }
    12. static int binary_search2(int[] arr,int l,int r){
    13. while (l
    14. int mid=l+r+1>>1;
    15. if(check(mid)){
    16. l=mid;
    17. }else {
    18. r=mid-1;
    19. }
    20. }
    21. return l;
    22. }

    根据具体情况选择判断后边界的取值,特别注意不同边界下mid的初始化.

    浮点二分:

    1. static double binary_search3(double[] arr,double l,double r){
    2. final double eps=1e-6;
    3. while (r-l>eps){
    4. double mid=(l+r)/2;
    5. if (check(mid)) r=mid;
    6. else l=mid;
    7. }
    8. return l;
    9. }

    浮点二分的核心在使用eps的精度进行判断

     

  • 相关阅读:
    Linux使用docker安装elasticsearch-head
    基于Java实现的设备模拟器
    re 正则从文本中提取全球电话和邮箱
    2022下半年《软考-系统架构设计师》备考经验分享
    Windows OpenGL 图像反色
    ant design Pro中 initialState的使用方法
    什么是坚韧型人格?坚韧型人格的职业发展规划
    K8S:配置资源管理 Secret和configMap
    TLS 1.0 至 1.3 握手流程详解
    阿里云ECS香港服务器性能强大、cn2高速网络租用价格表
  • 原文地址:https://blog.csdn.net/vV_Leon/article/details/132123468