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


    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;
    }

      

  • 相关阅读:
    Nginx优化
    Mysql日常操作
    YUM源
    MySQL5.7安装手册
    自律——可以让我们活的更高级
    javascript中with的用法
    js中所有函数的参数(按值和按引用)都是按值传递的,怎么理解?
    base64编码的图片在网页中显示
    form表单提交没有跨域问题,但ajax提交存在跨域问题
    移动端1px的适配问题
  • 原文地址:https://www.cnblogs.com/lshao/p/9001742.html
Copyright © 2020-2023  润新知