排序算法笔记

81 阅读1分钟

1.快速排序

快速排序的思想是基于分治来做的,过程是:

  1. 确定分界点:左右边界和中间都可以。
  2. 调整区间,把整个区间根据x的值分为两半,把小于等于x的放在x左边。
  3. 递归处理左右两边。

模板:

void quick_sqrt(int q[],int l,int r){
    if(l >= r) return ;
    int x = q[l + r >> 1],i = l - 1,j = r + 1;
    while(i < j){
        do i++;while (x > q[i]);
        do j--;while (x < q[j]);
        if(i < j) swap(q[i],q[j]);
    }
    quick_sqrt(q,l,i-1);quick_sqrt(q,i+1,r);
}

2.归并排序

归并排序的主要思想也是分治,过程是:

  1. 确定分界点
  2. 把左边右边分别递归排序。
  3. 归并左边右边,合二为一。
void merge_sort(int q[],int l,int r){
    if(l >= r) return;
    int mid = r + l >> 1;
    merge_sort(q,l,mid);merge_sort(q,mid+1,r);
    int i = l,j = mid + 1,k = 0;
    while(i <= mid && j <= r){
        if(q[i] > q[j]) tmp[k++] = q[j++];
        else tmp[k++] = q[i++];
    }
    while(i <= mid) tmp[k++] = q[i++];
    while(j <= r) tmp[k++] = q[j++];
    for(int i = l,j = 0;i <=r;) q[i++] = tmp[j++];
}

3.二分算法

整数二分:

int bsearch_1(int l,int r){
    while(l < r){
        int mid = l + r >> 1;
        if(check(q[mid])) r = mid;
        else l = mid + 1;
    }
    return l;
}
int bsearch_2(int l,int r){
    while(l < r){
        int mid = l + r + 1 >> 1;
        if(check(q[mid])) l = mid;
        else r = mid - 1;
    }
    return l;
}

小数二分:

double bsearch_3(double l,double r){
    while(l - r > 1e-6){
        double mid =(l + r)/2;
        if(mid * mid >= 2) l = mid;
        else r = mid - 1;
    }
    return l;
}