经典排序算法的经典问题

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,否则找到。

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

  

猜你喜欢

转载自www.cnblogs.com/lshao/p/9001742.html