• 编程之美2.5:寻找最大的K个数


    编程之美2.5:寻找最大的K个数

    引申:寻找第k大的数:

    方法一:

    // 选择第k大的数(通过改进快速排序来实现)
            public static void SelectShort(int[] array, int low, int high, int k, out int value)
            {
                int i = low;
                int j = high;
                int tempItem = array[low];
                value = int.MinValue;
    
                while (low < high)
                {
                    while (array[high] > tempItem
                        && high > low)
                    {
                        high--;
                    }
    
                    if (low < high)
                    {
                        array[low] = array[high];
                        low++;
    
                        while (array[low] <= tempItem
                            && low < high)
                        {
                            low++;
                        }
    
                        array[high] = array[low];
                        high--;
                    }
                }
    
                array[low] = tempItem;
    
    
                if (low == array.Length - k)
                {
                    value = array[low];
                    return;
                }
                else if (low < array.Length -k) // 第k个元素在右分支中
                {
                    if (low + 1 < j)
                    {
                        SelectShort(array, low + 1, j, k, out value);
                    }               
                }
                else // (low > k-1)第k个元素在左分支中
                {
                    if (i < low - 1)
                    {
                        SelectShort(array, i, low - 1,k,out value);
                    }               
                }            
            }

     方法二:

    借助编程之美的思想,求前k个最大的数,其中最小的就是。

      // 创建最大堆
            public static void CreateStack(int[] array, int startIndex, int lastIndex)
            {
                for (int root = lastIndex / 2; root >= startIndex; root--)
                {
                    int currentRoot = root;
                    int leftLeafIndex = 2 * root + 1; // 左孩子
                    int rightLeafIndex = leftLeafIndex +1; // 右孩子
    
                    while (leftLeafIndex <= lastIndex)
                    {
                        if (leftLeafIndex < lastIndex
                            && rightLeafIndex <= lastIndex
                            && array[leftLeafIndex] < array[rightLeafIndex])// 右孩子存在而且右孩子大于左孩子
                        {
                            leftLeafIndex++;
                        }
    
                        if (array[leftLeafIndex] > array[root])
                        {
                            int temp = array[root];
                            array[root] = array[leftLeafIndex];
                            array[leftLeafIndex] = temp;
    
                            currentRoot = 2 * currentRoot + 1; //继续寻找是否到了叶子结点
                            leftLeafIndex = 2 * currentRoot + 1;
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }
    
            //堆排序
            public static void StackSort(int[] arrary)
            {
                CreateStack(arrary, 0, arrary.Length - 1);
    
                int temp;
    
                for (int j = arrary.Length - 1; j > 0; j--)
                {
                    temp = arrary[j];
                    arrary[j] = arrary[0];
                    arrary[0] = temp;
    
                    CreateStack(arrary, 0, j - 1);
                }
            }
  • 相关阅读:
    fastDFS同步问题讨论
    Android开发(26)--补间动画(Tween)的实现
    android布局
    Linux特殊权限:SUID、SGID、SBIT
    如何使用ssh-keygen生成key
    Linux中环境变量到底写在哪个文件中?解析login shell 和 no-login shell
    使用ssh无密码登录
    github中的ssh配置
    PHP中的一个很好用的文件上传类
    [置顶] js模板方法的思路及实现
  • 原文地址:https://www.cnblogs.com/Jessy/p/3508857.html
Copyright © 2020-2023  润新知