美文网首页
归并算法

归并算法

作者: 小骄傲999 | 来源:发表于2020-08-28 13:03 被阅读0次

在做力扣的第51题数组的逆序对时,当时我首先想到的是暴利求解,但是暴利求解在这道题中不能使用,因为力扣会给大量的数据,暴利求解很耗时,因此不能够使用。然后就研究了归并算法的解题思路,首先就是先将数组进行拆分,拆成左右两组数据,然后每组数据在进行拆分,直到剩余一个数据的时候进行,两两排序。下边就套算法吧!

public class Solution {    

        static int count = 0;    

        public int ReversePairs(int[] nums) {        

                    sort(nums,0,nums.Length-1);        

                    return count;    

        }    

        //进行递归    

        public static void sort(int[] nums,int L, int R){        

                   if(L>=R){            

                    return;        

                    }       

                     int mid = L+((R-L)>>1);        

                     sort(nums, L, mid);        

                    sort(nums, mid+1, R);        

                    merge(nums,L,mid,R);    

        }    

        //进行数组合并    

        public static void merge(int[] nums,int L,int Mid, int R){       

                 int[] temp = new int[R-L+1];       

                 int i =0;        

                 int p1 = L;       

                 int p2 = Mid+1;        

                while(p1<=Mid && p2<=R){    

                            //当左边大于右边的时候,说明在后边,让count++

                            if(nums[p1]>=nums[p2]){                

                                        //左边如果等于右边,让count--

                                            for (int j = p1; j < Mid + 1; j++) {                    

                                                    if (nums[j] == nums[p2]){                        

                                                                count--;                        

                                                                continue;                    

                                                    }                   

                                                     break;               

                                             }               

                                             if ((Mid + 1 - p1) >= 0)  {                    

                                                        count = count + Mid + 1 - p1;                

                                                }            

                                        }           

                                         temp[i++] = nums[p1]<nums[p2]?nums[p1++]:nums[p2++];        

                 }       

                 while(p1<=Mid){            

                        temp[i++] = nums[p1++];       

                 }       

                 while(p2<=R){           

                     temp[i++] = nums[p2++];      

                }        

                for(i=0;i<temp.Length;i++){           

                 nums[L+i] = temp[i];        

                }   

        }

}

相关文章

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • 第三章:高级排序算法

    归并排序算法(mergeSort) 算法思想:Python使用函数实现: 自底向上的归并排序算法 算法思想:Pyt...

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • C++中级算法第六天(归并算法)

    归并算法解释: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Div...

  • 归并算法

    归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。归并算法的中心是归并两...

  • 归并排序

    归并排序 这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*l...

  • iOS - 归并排序

    Demo_github 归并排序: 归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,算法主...

  • 数据结构--归并排序

    归并排序 (Merge Sort) 归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divid...

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 算法与数据结构(三)高级排序算法:O(nlogn)的算法:归并排

    O(nlogn)的算法 优化改进的算法要比笨的算法快太多。 归并排序:Merge Sort 然后从下向上逐层归并。...

网友评论

      本文标题:归并算法

      本文链接:https://www.haomeiwen.com/subject/ffqlsktx.html