Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Сортировка списка List


Автор: factura 15.9.2014, 22:10
Имеется список List содержащий около 50000 значений, нужно отсортировать этот список таким образом что бы наиболее часто встречающиеся элементы были так сказать на поверхности. Как найти алгоритм сортировки?

Автор: jonie 16.9.2014, 10:44
Цитата(factura @  15.9.2014,  23:10 Найти цитируемый пост)
Как найти алгоритм сортировки? 


http://lmgtfy.com/?q=%D0%9A%D0%B0%D0%BA+%D0%B8%D1%81%D0%BA%D0%B0%D1%82%D1%8C+%D0%B2+%D0%B3%D1%83%D0%B3%D0%BB%D0%B5

Автор: Экскалупатор 17.9.2014, 10:55
ну если сильно не изголяться, то можно создать массив счетчиков, лучше словарь. где каждая запись будет представлять уникальное значение из первого массива и поле с количеством таких элементов. потом пробежаться по первому списку и делать +1 к соответствующему элементу во втором массиве. потом сортируем второй массив по счетчикам, потом пересобираем первый массив исходя из полученных данных.

Автор: Rockie 18.9.2014, 23:18
надо тренироваться поэтому мой вариант. Если что, готов слушать дельную критику по коду, если таковая будет..

Код
using System;
using System.Collections.Generic;
using System.Linq;

namespace SortListByOccuriences
{
    class Program
    {
        // display list
        public static void Display(List<int> list)
        {
            foreach (var l in list)
            {
                Console.Write(l + " ");
            }
            
            Console.WriteLine();
        }


        private static void Main()
        {
            var list = new List<int> { 1, 2, 2, 3, 0, 9, 5, 7, 4, 5, 7, 9, 10, 5 };
            Display(list);

            // сначала отсортируем существующий список
            list.Sort();
            Display(list);
            

            // далее создадим какую-то другую структуру, наприммер словарь
            var occuriences = new Dictionary<int, int>();

            // и занесём в неё элементы и количество их вхождений
            int firstPosition = 0, lastPosition = 0;

            while (lastPosition != list.Count)
            {
                // значение
                int value = list[firstPosition];
                lastPosition = list.LastIndexOf(value) + 1;

                // количество вхождений
                int count = lastPosition - firstPosition;

                // этот словарь будет содержать элемент и количество его вхождений
                occuriences.Add(value, count);

                Console.Write(" " + value + "-" + count);
                Console.WriteLine();

                firstPosition = lastPosition;
            }


            // далее остаётся отсортировать полученный словарь 
            // в C# это можно сделать через делегат, если без "наворотов"
            // то на самостоятельную работу
            foreach (KeyValuePair<int, int> item in occuriences.OrderByDescending(key => key.Value))
            {
                // do something with item.Key and item.Value
                for(int i = 0; i< item.Value; i++)
                {
                    Console.Write(item.Key + " ");
                }
            }
        }
    }
}

Автор: jonie 19.9.2014, 11:47
я думаю что как минимум подсчет количества одинаковых можно производить при сортировке... а может быть деревья использовать, короче надо брать листочек и по-уму считать сложность

Автор: Miller_time 20.10.2014, 18:23
Еще как вариант:

Код

namespace TestMyAPP
{
    class Program
    {

        public class UserData
        {
            public int Group { get; set; }
            public string Value { get; set; }

            public UserData(int Group, string Value)
            {
                this.Group = Group;
                this.Value = Value;
            }
        }

        static void Main(string[] args)
        {
            Console.WriteLine("{0}", "Start APP");
            List<UserData> items = new List<UserData> { 
                new UserData(1,"Иван"),
                new UserData(2,"Николай"),
                new UserData(3,"Николай"),
                new UserData(4,"Василий"),
                new UserData(5,"Михаил"),
                new UserData(6,"Егор"),
                new UserData(7,"Николай"),
                new UserData(8,"Игорь"),
                new UserData(9,"Михаил"),
            };
            var Users = (from g in items
                         group g by g.Value into p
                         select new
                         {
                             p.Key,
                             CountValue = (from t in items
                                           where t.Value == p.Key
                                           select t).Count()

                         }).ToList().OrderByDescending(x => x.CountValue);

            foreach (var d1 in Users)
            {
                Console.WriteLine("{0} - {1}", d1.Key,d1.CountValue);
            }
            Console.ReadLine();
        }
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)