解决方案 »

  1.   

    Top K算法问题的实现http://blog.csdn.net/caryaliu/article/details/8135898
      

  2.   


                int[] ooxx = new int[5] { 1, 9, 5, 7, 2 };
                var xxoo = ooxx.OrderByDescending(d => d).Skip(0).Take(3).ToArray();
                for (int i = 0; i < ooxx.Length; i++)
                {
                    for (int j = 0; j < xxoo.Length; j++)
                    {
                        if (xxoo[j]==ooxx[i])
                        {
                            Console.WriteLine("排行第" + (j + 1).ToString() + "的数字是" + xxoo[j] + "在数组中的索引是" + (i + 1).ToString());
                        }
                    }
                }
    自行测试..
      

  3.   

    按条件检索数组中的元素
     private void txt_find_TextChanged(object sender, EventArgs e)
            {
                if (txt_find.Text != string.Empty)//判断查找字符串是否为空
                {
                    string[] P_str_temp = Array.FindAll//使用FindAll方法查找相应字符串
                        (G_str_array, (s) => s.Contains(txt_find.Text));
                    if (P_str_temp.Length > 0)//判断是否查找到相应字符串
                    {
                        txt_display.Clear();//清空控件中的字符串
                        foreach (string s in P_str_temp)//向控件中添加字符串
                        {
                            txt_display.Text += s + Environment.NewLine;
                        }
                    }
                    else
                    {
                        txt_display.Clear();//清空控件中的字符串
                        txt_display.Text = "没有找到记录";//提示没有找到记录
                    }
                }
                else
                {
                    txt_display.Clear();//清空控件中的字符串
                }
            }
      

  4.   

    也可以利用 System.Linq 对数组的最大最小的取值
      

  5.   

    http://blog.csdn.net/xianfajushi/article/details/21540383
      

  6.   

    如果数据量很小,例如只有100个元素,那么“先排序”是个不错的主意。如果数据量比较大,那么根本不需要排序。查找“第N大”元素,这个叫做“划分算法”,是快速排序的基础。但是划分算法快速地给你划分出“前N个”或者“后N个”元素,划分出来的元素不保证是按大小顺序的,因为人家根本不排序,只是以划分为目的。因此划分算法的速度远远大于“先排序”的算法。
      

  7.   

    先TOPK,然后再用返回的数据与原数据相比较,如果相等,则返回下标,直到完成。还需要别做一个检查代码,如果当前下标已经标出,则继续,这样可以避免相同数据全部被输出成一个下标
      

  8.   

    周末把已有C++程序稍加修改为C#,足以证明算法跨语言:自然将收录在专栏内,以便查看.            /*从一维数组100个数据中选出最大10个数的下标及最小6个数的下标*/
                int[] 数据 = { 3, 33, 333, 6, 66, 666, 9, 99, 999, 8, 88, 888, 5, 55, 555, 2, 22, 222, 1, 11, 111, 4, 44, 444, 7, 77, 777 },
                    大数 = Enumerable.Repeat(int.MinValue, 10).ToArray(), 小数 = Enumerable.Repeat(int.MaxValue, 6).ToArray(), 大下标 = new int[大数.Count()], 小下标 = new int[小数.Count()];
                int 下标 = 0;
                do
                {
                    int 序 = 0, 排序大 = 大数.Count() - 1, 排序小 = 小数.Count() - 1;
                    do
                    {
                        if (数据[下标] > 大数[序])
                        {
                            while (排序大 - 序 > 0)
                            {
                                大下标[排序大] = 大下标[排序大 - 1];
                                大数[排序大] = 大数[排序大-- - 1];
                            }
                            大下标[序] = 下标;
                            大数[序] = 数据[下标];
                        }
                        if (序 <= 排序小)
                            if (数据[下标] < 小数[序])
                            {
                                while (排序小 - 序 > 0)
                                {
                                    小下标[排序小] = 小下标[排序小 - 1];
                                    小数[排序小] = 小数[排序小-- - 1];
                                }
                                小下标[序] = 下标;
                                小数[序] = 数据[下标];
                            }
                    } while (序++ < 排序大);
                } while (++下标 < 数据.Count());
      

  9.   

    优化代码:            /*从一维数组100个数据中选出最大10个数的下标及最小6个数的下标,周末把已有C++程序稍加修改为C#,足以证明算法跨语言:自然将收录在专栏内,以便查看.*/
                int[] 数据 = { 3, 33, 333, 6, 66, 666, 9, 99, 999, 8, 88, 888, 5, 55, 555, 2, 22, 222, 1, 11, 111, 4, 44, 444, 7, 77, 3333, 6666, 9999, 8888, 5555, 2222, 1111, 4444, 7777, 33333, 66666, 99999, 88888, 55555, 22222, 11111, 44444, 77777, 333333, 666666, 999999, 888888, 555555, 222222, 111111, 444444, 777777, 999999 },
                    大数 = Enumerable.Repeat(int.MinValue, 10).ToArray(), 小数 = Enumerable.Repeat(int.MaxValue, 6).ToArray(), 大下标 = new int[大数.Count()], 小下标 = new int[小数.Count()];
                int 下标 = 0, 序 = 0, 排序大 = 大数.Count() - 1, 排序小 = 小数.Count() - 1;
                do
                {
                    if (序 < 排序大)
                    {
                        if (数据[下标] > 大数[序])
                        {
                            while (排序大 - 序 > 0)
                            {
                                大下标[排序大] = 大下标[排序大 - 1];
                                大数[排序大] = 大数[排序大-- - 1];
                            }
                            大下标[序] = 下标;
                            大数[序] = 数据[下标];
                        }
                        if (序 <= 排序小)
                            if (数据[下标] < 小数[序])
                            {
                                while (排序小 - 序 > 0)
                                {
                                    小下标[排序小] = 小下标[排序小 - 1];
                                    小数[排序小] = 小数[排序小-- - 1];
                                }
                                小下标[序] = 下标;
                                小数[序] = 数据[下标];
                            }
                        ++序;
                    }
                    else
                    { 
                        序 = 0; 
                        排序大 = 大数.Count() - 1; 
                        排序小 = 小数.Count() - 1;
                        ++下标;
                    }
                } while (下标 < 数据.Count());当然还可以继续优化代码,将在不博客专栏内发表