算法实现之应用分治策略的算法实现2

1.同时找出数组中最大最小元素

Java实现

public static int[]findmaxmin(int[]arr)
    {
        int []arr0 = new int[2];
        if(arr.length==1)
        {
            arr0[0]=arr[0];//设为最大
            arr0[1]=arr[0];//设为最小
        }
        else
        {
            int[]arr1 = new int[arr.length/2];
            int a;
            if(arr.length%2==0)
            {
                a = arr.length/2;
            }
            else
            {
                a = arr.length/2+1;
            }
            int[]arr2 = new int[a];
            System.arraycopy(arr, 0, arr1, 0, arr.length / 2);
            System.arraycopy(arr, arr.length/2, arr2, 0, arr.length-arr.length/2);
            arr0[0]=Math.max(findmaxmin(arr1)[0],findmaxmin(arr2)[0]);//递归比较最大
            arr0[1]=Math.min(findmaxmin(arr1)[1],findmaxmin(arr2)[1]);//递归比较最小

        }
        return arr0;
    }

python实现 

def find_max_min(arr):
    arr0 = [0, 0]
    if len(arr) == 1:
        arr0[0] = arr[0]
        arr0[1] = arr[0]
    else:
        arr1 = arr[:len(arr)//2]
        if len(arr) % 2 == 0:
            a = len(arr) // 2
        else:
            a = len(arr) // 2 + 1
        arr2 = arr[len(arr)//2:len(arr)]
        arr0[0] = max(find_max_min(arr1)[0], find_max_min(arr2)[0])
        arr0[1] = min(find_max_min(arr1)[1], find_max_min(arr2)[1])
    return arr0

2.锦标赛算法求数组第二大数

1、首先进行两两分组比较,大的数进入下一轮;被淘汰的数标记在淘汰它的元素上

2、每轮进行比拼,直到剩下1个元素即max为止

3、然后在被max淘汰的数里面找到最大的数,这个最大的数就是数组里的第二大的数

Java实现

public static void cmp(int[] a, int[] b, int n, int k, int v)
    {
        int k1 = k * 2 + 1;
        int k2 = k1 + 1;

        if (k1 >= n || k2 >= n)
        {
            b[k] = -1;
            return;
        }

        if (b[k1] == v)
        {
            cmp(a, b, n, k1, v);
        }
        else
        {
           cmp(a, b, n, k2, v);
        }

        if (b[k1] < 0)
        {
            if (b[k2] >= 0)
            {
                b[k] = b[k2];
            } else
            {
                b[k] = -1;
            }
            return;
        }

        if (b[k2] < 0)
        {
            if (b[k1] >= 0)
            {
                b[k] = b[k1];
            } else {
                b[k] = -1;
            }
            return;
        }

        if (a[b[k1]] > a[b[k2]])
        {
            b[k] = b[k1];
        } else {
            b[k] = b[k2];
        }
    }

    public static void findsecondmax(int[] a, int len)
    {
        int n = 1;
        while (n < len)
        {
            n *= 2;
        }

        int[] b = new int[2 * n - 1];
        for (int i = 0; i < n; i++)
        {
            if (i < len)
            {
                b[n - 1 + i] = i;
            }
            else
            {
                b[n - 1 + i] = -1;
            }
        }

        for (int i = 2 * n - 2; i > 0; i -= 2)
        {
            if (b[i] < 0)
            {
                if (b[i - 1] >= 0)
                {
                    b[(i - 1) / 2] = b[i - 1];
                } else {
                    b[(i - 1) / 2] = -1;
                }
            }
            else
            {
                if (a[b[i]] > a[b[i - 1]])
                {
                    b[(i - 1) / 2] = b[i];
                } else {
                    b[(i - 1) / 2] = b[i - 1];
                }
            }
        }

        cmp(a, b, 2 * n - 1, 0, b[0]);

        System.out.println("第二大的数为: " + a[b[0]]);
    }

python实现

def show(array, len):
    for i in range(len):
        print("{:<3d}".format(array[i]), end=" ")
    print()

def pk(a, b, n, k, v):
    k1 = k * 2 + 1
    k2 = k1 + 1

    if k1 >= n or k2 >= n:
        b[k] = -1
        return

    if b[k1] == v:
        pk(a, b, n, k1, v)
    else:
        pk(a, b, n, k2, v)

    if b[k1] < 0:
        if b[k2] >= 0:
            b[k] = b[k2]
        else:
            b[k] = -1
        return

    if b[k2] < 0:
        if b[k1] >= 0:
            b[k] = b[k1]
        else:
            b[k] = -1
        return

    if a[b[k1]] > a[b[k2]]:
        b[k] = b[k1]
    else:
        b[k] = b[k2]

def FindSecond(a, len):
    n = 1
    while n < len:
        n *= 2

    b = [0] * (2 * n - 1)
    for i in range(n):
        if i < len:
            b[n - 1 + i] = i
        else:
            b[n - 1 + i] = -1

    for i in range(2 * n - 1 - 1, 0, -2):
        if b[i] < 0:
            if b[i - 1] >= 0:
                b[(i - 1) // 2] = b[i - 1]
            else:
                b[(i - 1) // 2] = -1
        else:
            if a[b[i]] > a[b[i - 1]]:
                b[(i - 1) // 2] = b[i]
            else:
                b[(i - 1) // 2] = b[i - 1]

    pk(a, b, 2 * n - 1, 0, b[0])

    print("第二大的数: {}".format(a[b[0]]))

本文仅为学习记录,如有错误欢迎指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值