• 经典排序算法的经典问题


    1.荷兰三色国旗问题

      问题描述:一个数组只含有三种元素:0,1,2,不使用计数排序,将0放在1的左边,2放在1的右边。

      分析:

         1.可借鉴快排中划分的思想。将数组分为{0区},arr[],{2区}

          2.遍历arr,当发现0时,0区向右扩,发现2时,2区向左扩,

         3.当前元素进入2区时,结束。

      

     vector<int> sortThreeColor(vector<int> A, int n) {
            // write code here
            int last0=-1;
            int first2=n;
            for(int i=0;i<n;i++){
                if(i==first2) break;
                if(A[i]==0){
                    int temp=A[last0+1];
                    A[last0+1]=0;
                    last0++;
                    A[i]=temp;
                }
                if(A[i]==2){
                    int temp=A[first2-1];
                    A[first2-1]=2;
                    first2--;
                    A[i]=temp;
                    i--;//(由于2区换来的数未进行判断,需重新判断一次)
                }
            }
            return A;
        }

    2.行列矩阵查找元素的问题

      问题描述:在一个行列都有序的二维矩阵中,找出某个元素。

      如矩阵:1 2 3 4   查找元素6

          2 3 3 4

          3 4 6 7

      分析:首先从矩阵右上角开始,如果当前元素e>6,则往左走,即列-1,如果e<6,则往下走,即行+1,否则找到。

         如果当前元素下标超出矩阵范围,则找不到。

    3.最短未排序子数组

      

    对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。

    给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度。(原序列位置从0开始标号,若原序列有序,返回0)。保证A中元素均为正整数。

    测试样例:
    [1,4,6,5,9,10],6
    返回:2
     vector<int> sortThreeColor(vector<int> A, int n) {
            // write code here
            int last0=-1;
            int first2=n;
            for(int i=0;i<n;i++){
                if(i==first2) break;
                if(A[i]==0){
                    int temp=A[last0+1];
                    A[last0+1]=0;
                    last0++;
                    A[i]=temp;
                }
                if(A[i]==2){
                    int temp=A[first2-1];
                    A[first2-1]=2;
                    first2--;
                    A[i]=temp;
                    i--;
                }
            }
            return A;
        }

     4.计算排序后相邻两数的最大差值

    问题描述:

    有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。

    给定一个int数组AA的大小n,请返回最大的差值。保证数组元素多于1个。

    测试样例:
       [1,2,5,4,6],5
    返回:2

    分析:

      1.使用基于桶排序的思想对数据进行划分,得到相邻划分区间的最大差值。

    步骤:

      1.找出max,min。

      2.len=max-min。

      2.创建N+1个桶,前N个桶存放落于区间 [min+i*len,min+(i+1)*len )内的数组元素。(由于初值是min,间距是len,分析可以就可以算出来)

      3.把最大值(可能不止一个)放入最后一个桶内。

      4.找出相邻桶相差最大的那个的值。(前一个桶的数组元素的最大值,后一个桶的数组元素的最小值)

    附实现代码:

    int maxGap(vector<int> A, int n) {
    // write code here
        int maxValue,minValue;
        maxValue=minValue=A[0];
        for(int i=1;i<n;i++){
            if(A[i]>maxValue) maxValue=A[i];
            if(A[i]<minValue) minValue=A[i];
        }
        if(maxValue==minValue) return 0;
        vector<vector<int> > data(n+1);
    
        int len=(maxValue-minValue);
        for(int i=0;i<n;i++){
            if(A[i]==maxValue)  data[n].push_back(A[i]);
            else{
                int k=(A[i]-minValue)*n/len;
    
                data[k].push_back(A[i]);
            }
        }
        int MaxGap=0;
        for(int i=0;i<n;i++){
            if(data[i].size()==0) continue;
            else{
                int j=i+1;
                while(data[j].size()==0) j++;
                int m1=data[i][0],m2=data[j][0];
                for(int ii=1;ii<data[i].size();ii++)
                    if(m1<data[i][ii]) m1=data[i][ii];
                for(int jj=1;jj<data[j].size();jj++)
                    if(m2>data[j][jj]) m2=data[j][jj];
    
                if(MaxGap<(m2-m1)) MaxGap=m2-m1;
            }
        }
    
        return MaxGap;
    }

      

  • 相关阅读:
    20200226 Java IO流——廖雪峰
    20200225 Java 多线程(2)-廖雪峰
    20200225 Java 多线程(1)-廖雪峰
    20200224 尚硅谷ElasticSearch【归档】
    20200224 一 概述
    20200222 尚硅谷Dubbo【归档】
    20200222 四、dubbo原理
    Improved robustness of reinforcement learning policies upon conversion to spiking neuronal network platforms applied to Atari Breakout game
    Reinforcement learning in populations of spiking neurons
    Solving the Distal Reward Problem through Linkage of STDP and Dopamine Signaling
  • 原文地址:https://www.cnblogs.com/lshao/p/9001742.html
Copyright © 2020-2023  润新知