0
点赞
收藏
分享

微信扫一扫

排序与二分

半夜放水 2022-01-08 阅读 53

今天,算法篇要续更了。内容的话对于一些算法竞赛是适用的。内容涵盖:

  • 基础算法:排序,二分,前缀和差分等等。
  • 数据结构:栈,队列,堆,哈希等等。
  • 图论与搜索:图的应用+DFS+BFS等等。
  • 贪心算法:区间问题+huffman树等等。
  • 动态规划:线性,区间等等。
  • 数学类:快速幂,博弈论等等。(这个看时间)
    理论补充完后,将补充习题,正文开始。

排序包含:快速排序和归并排序。

快速排序:
1.确定枢轴量x,以及双指针i,j。
2.交换元素,使得左区间元素小于等于x,右区间大于等于x。
3.递归左区间,递归右区间。
算法模板如下:

#include<iostream>
using namespace std;
int q[n]; //存放待排序元素

void quick_sort(int q[],int l,int r){
   if(l>=r) return; //边界处理,递归终点
   int x=q[l],i=l-1,j=r+1;
   while(l<r){
      do i++; while(q[i]<x); 
      do j--; while(q[j]>x);
      if(i<j) swap(q[i],q[j]); //内置交换函数
}
  quick_sort(q,l,j);
  quick_sort(q,j+1,r);
}

  上面的模板,可以解决所有的边界问题。因此,可以直接用,要是调整边界的话,注意修改的正确性。
归并排序
1.确定边界值mid=(l+r)/2;
2.归并排序左半边,归并排序右半边。
3.归并,将两个有序序列归并为一个序列。
模板:

#include<iostraem>
using namespace std;
int q[n],temp[n]; //q待排序数组;temp辅助数组,是必要的。
void merge_sort(int q[],int l,int r){
    if(l>=r) return;
    int mid=(l+r)/2;
    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]) temp[k++]=q[i++];
        else temp[k++]=q[j++];
}
    while(i<=mid) temp[k++]=q[i++];
    while(j<=r) temp[k++]=q[j++];
    for(int i=l,j=0;i<=r;i++,j++) q[i]=temp[j];
}
举报

相关推荐

0 条评论