IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    求数组中前两个最大数的算法

    yoyo发表于 2015-03-27 10:35:00
    love 0

    前段时间在捣鼓图像二值化的时候学到的算法(来源网页已经找不到了,,,汗),然后自己优化了一下(后面会再写一篇文章记录一下图像二值化的各种算法)。

    #include 
    
    void max2index(int *arr, int n, int *first_idx, int *second_idx) {
        //第 0 个最大数,第 1 个次大数
        int max2idx[2] = { 0 ,-1};//考虑两个以上相同最大数,只取第一次匹配到的数
        //int max2idx[2] = { 0 ,0};//如果不需要考虑有两个以上相同最大数
        int i;
        for(i = 1; i < n; ++i) {
            //printf("%d,%d,%d,%d\n",i,arr[i],max2idx[0],max2idx[1]);
            if(arr[i] > arr[max2idx[0]]) {
                //如果比最大数还要大,则最大数取它,之前的最大数移入次大数
                int t = max2idx[0];
                max2idx[0] = i;
                max2idx[1] = t;
            } else if (arr[i] < arr[max2idx[0]]){
                if (-1 == max2idx[1] || arr[i] > arr[max2idx[1]]) {
                    //如比最大数小:如次大数没有设置,则设为次大数;否则比次大数大才设为最大数
                    max2idx[1] = i;
                }
            }
        }
        *first_idx = max2idx[0];
        if(max2idx[1] == -1) max2idx[1] = max2idx[0];//如果数组全是一样的数的情况,次大数则为没设置状态
        *second_idx = max2idx[1];
    }
    
    void printarr(int *arr,int n) {
        while(n-- > 1)printf("%d,",*(arr++));
        printf("%d\n",*arr);
    }
    
    int main() {
        int arr[] = {10,2,3,4,5,6,7,8,9,10};
        //int arr[] = {1,1,1,1,1,1,1,1,1,1};
        printarr(arr,10);
    
        int first_idx,second_idx;
        max2index(arr,10,&first;_idx,&second;_idx);
        printf("first index:%d,second index:%d\n",first_idx,second_idx);
        printf("first:%d,second:%d",arr[first_idx],arr[second_idx]);
    }
    


沪ICP备19023445号-2号
友情链接