经典算法 - wenzhoullq/leetcode GitHub Wiki

冒泡

题目

147. 对链表进行插入排序 冒泡排序

1536. 排布二进制网格的最少交换次数 冒泡

899. 有序队列 类似于冒泡,k >= 2 一定能排列成功

快排

    void sort(int left,int right){
        if(left>=right) return;
        int par = nums[left],i = left ,j = right;
        while(i<j){
            while(i<j&&nums[j]>=par) j--;
            if(i<j){
                nums[i] = nums[j];
            }
            while(i<j&&nums[i]<=par) i++;
            if(i<j){
                nums[j] = nums[i];
            } 
        }
        nums[i] = par;
        sort(left,i-1);
        sort(i+1,right);
    }

题目

215. 数组中的第K个最大元素 topk,快排取一半

912. 排序数组

归并

归并算法和快排相对,它是自底向上的;与快排相比较,它会需要多一个数组来记录原始位置。

归并有一个经典的运用,就是逆序对,逆序对是针对右边有多少比它大/小的题目,针对逆序对来讲,在i移动的时候,j-mid-1就是逆序对的个数

模板

  void sort(pair[] arr,int l,int r){
        if(l>=r)  return ;
        int mid=(l+r)/2;
        sort(arr,l,mid);
        sort(arr,mid+1,r);
        merge(arr,l,r,mid);
    }
    void merge(pair[] arr,int left,int right,int mid){
       for(int i=left;i<=right;i++) temp[i]=arr[i];
        int i=left,j=mid+1,index=left;// j=mid+1是非常容易错的点
        while(i<=mid||j<=right){
            if(i>mid) arr[index++]=temp[j++];
            else if(j>right) arr[index++]=temp[i++];
            else if(temp[i].val>temp[j].val) arr[index++]=temp[j++];
            else arr[index++]=temp[i++];
        }

题目

148. 排序链表

315. 计算右侧小于当前元素的个数

493. 翻转对 逆序对的时候可以在外面做,不容易错

⚠️ **GitHub.com Fallback** ⚠️