• 基础算法_Sort


    Quick_Sort and Merge_Sort

    Quick_Sort: 由小到大排序

    算法思路:

    • 确定一个分界点x, 设置两个指针i、j, i从下标0到x的下标处从前到后遍历, j由下标n - 1,到x的下标处由后到前遍历。
    • 当i所指的数比x大,此时i指针停止。
    • 当j所指的数比x小,此时j指针停止。
    • 交换i、j所指的数。
    • 继续进行i、j的操作,最终使得x左边的数都比x小,x右边的数都比x大。
    • 递归进行以上操作

    代码

    void quick_sort(int a[],int l,int r) {
        if(l >= r) return ;
        // 确定分界点、i、j指针
        int x = a[(l + r) / 2], i = l - 1, j = r + 1;
        while(i < j) {
            do i++; while(a[i] < x);
            do j--; while(a[j] > x);
            if(i < j) swap(a[i],a[j]); // 交换两者
        }
        // 递归
        quick_sort(a,l,j);
        quick_sort(a,j+1,r);
    }
    

    Merge_Sort: 由小到大排序

    算法思路:

    • 对数组进行划分
    • 合并

    代码

    void merge_sort(int a[], int l, int r) {
        if(l >= r) return;
        // divide
        int mid = l + r >> 1;
        merge_sort(a, l, mid); merge_sort(a, mid + 1, r);
    
        int k = 0, i = l, j = mid + 1;
        while(i <= mid && j <= r) {
            if(a[i] < a[j]) tmp[k++] = a[i++];
            else tmp[k++] = a[j++];
        }
        while(i <= mid) tmp[k++] = a[i++];
        while(j <= r) tmp[k++] = a[j++];
        // merge
        for(int i = l, j = 0; i <= r; i++, j++) a[i] = tmp[j];
    }
    

    完整代码

    #include <iostream>
    
    using namespace std;
    
    const int N = 1e6 + 10;
    int a[N], t[N];
    
    void quick_sort(int a[],int l,int r) {
        if(l >= r) return ;
        
        int x = a[(l + r) / 2], i = l - 1, j = r + 1;
        while(i < j) {
            do i++; while(a[i] < x);
            do j--; while(a[j] > x);
            if(i < j) swap(a[i],a[j]);
        }
        quick_sort(a,l,j);
        quick_sort(a,j+1,r);
    }
    
    void merge(int a[], int l, int r) {
        if(l >= r) return ;
        int mid = l + r >> 1;
        merge(a, l, mid); merge(a, mid + 1, r);
        int k = 0, i = l, j = mid + 1;
        while(i <= mid && j <= r) {
            if(a[i] < a[j]) t[k++] =  a[i++];
            else t[k++] = a[j++];
        }
        while(i <= mid) t[k++] = a[i++];
        while(j <= r) t[k++] = a[j++];
        
        for(int i = l, j = 0; i <= r; i++, j++) a[i] = t[j];
        
    }
    
    int main() {
        int n; scanf("%d",&n);
        for(int i = 0; i < n; i++) scanf("%d",&a[i]);
        // quick_sort(a, 0, n - 1);
        merge(a, 0, n - 1);
        for(int i = 0; i < n; i++) printf("%d ",a[i]);
        return 0;
        
    }
    
  • 相关阅读:
    vue 虚拟列表
    图片验证
    md5 文件上传
    js中apply方法的使用
    js通过replace()方法配合正则去除空格
    使用bind()方法扩充作用域
    取数组最大最小值得方法
    css穿透点击
    为什么选择器li#id名/li.类名的写法
    子元素与父元素等高
  • 原文地址:https://www.cnblogs.com/Hot-machine/p/13186402.html
Copyright © 2020-2023  润新知