ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

磊磊零基础打卡算法:day05

2022-05-06 02:00:41  阅读:193  来源: 互联网

标签:sort 边界 int mid day05 while 磊磊 打卡 模板


5.5

快速排序模板类型

    主要思想:分治;

  1. 对于这种边界容易出错的,直接背过模板就好

  2. 这里是需要先找出x分界点对其进行比较,然后比较,最后递归,

  3. void quick_sort(int q[], int l, int r) {
       if (l >= r)//如果左边大于有右边那么不符合条件,退出
           return;
       int x = q[l], i = l - 1, j = r + 1;//取数组的边界区域
       while (i < j) {
           do
               i++;
           while (q[i] < x);
           do
               j--;
           while (q[j] > x);
           //两个指针都在走,当发现还是存在i<j的情况就交换,
           if (i < j) {
               swap(q[i], q[j]);
           }
       }
       quick_sort(q, l, j);//分而治之
       quick_sort(q, j + 1, r);
    }

    排序的稳定:原来两个数的值是相同的,如果排完序后位置不发生变换就是叫做问稳定,快排是不稳定的,除非将序列里面的数都是不同的

归并排序

主要思想

  1. 归并需要先进行递归,最后再合

  2. 分界点的位置 x左右两边的平均值

  3. 三个指针,一个临时数组。

  4. 通过分开的两个指针比较大小之后用一个临时数组的指针进行存储

  5. 最后再将原来的数组给覆盖,最后这边思想需要多看看

  6. void merge_sort(int q[], int l, int r)
    {
       if (l >= r) return;
    
       int mid = l + r >> 1;
       merge_sort(q, l, mid);
       merge_sort(q, mid + 1, r);
    
       int k = 0, i = l, j = mid + 1;
       while (i <= mid && j <= r)
           if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];
           else tmp[k ++ ] = q[j ++ ];
    
       while (i <= mid) tmp[k ++ ] = q[i ++ ];
       while (j <= r) tmp[k ++ ] = q[j ++ ];
    
       for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
    }
    //转载至y总的算法模板:https://www.acwing.com/blog/content/277/

二分模板

  1. 主要思想
  • 如果想要查找的数小于中间边界就将mid赋值给左边界;

  • 反之就赋值给右边界;

  • 其实就是边界的问题,容易出错,两种模板

    • 找最大值中的最小:

    • 
      int main()
      {
          int l;
          int r;
          while(l < r)
          {
              int mid = (l + r)/ 2;
              if(check())//check函数就是需要判断是查找的数是跟左边比还是跟右边比,根据题目而定
              {
                  r = mid;  // 这里是 r = mid, 说明[l,mid]是合法范围
              }
              else
              {
                  l = mid + 1;   //  [l,mid]这个范围都不是合法范围,所以下一次查找直接从 l = mid + 1开始了
              }
              //最后的l,r是答案 因为 l == r ,最终就是答案。
          }         
      
      }
      
    • 找最小值中的最大:

    • 
      int main()
      {
          int l;
          int r;
          while(l < r)
          {
              int mid = (l + r + 1)/ 2;  // 这里要 l + r +1 要不然会死循环
              if(check())
              {
                  l = mid;         // mid这个位置 满足条件之后 查找 [mid , right]的位置, 所以l移到mid的位置
              }
              else
              {
                  r = mid - 1;     // [mid,r] 不满足条件, 所以要移到满足条件的一方, r = mid - 1 
              }
          } 
          //最后的l,r是答案 因为 l == r
      
      
}
```

标签:sort,边界,int,mid,day05,while,磊磊,打卡,模板
来源: https://www.cnblogs.com/gwl999/p/16227129.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有