Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка списка List 
:(
    Опции темы
factura
Дата 15.9.2014, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 6.1.2014

Репутация: нет
Всего: нет



Имеется список List содержащий около 50000 значений, нужно отсортировать этот список таким образом что бы наиболее часто встречающиеся элементы были так сказать на поверхности. Как найти алгоритм сортировки?
PM MAIL   Вверх
jonie
Дата 16.9.2014, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



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


как-то так ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Экскалупатор
Дата 17.9.2014, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



ну если сильно не изголяться, то можно создать массив счетчиков, лучше словарь. где каждая запись будет представлять уникальное значение из первого массива и поле с количеством таких элементов. потом пробежаться по первому списку и делать +1 к соответствующему элементу во втором массиве. потом сортируем второй массив по счетчикам, потом пересобираем первый массив исходя из полученных данных.
PM MAIL ICQ   Вверх
Rockie
Дата 18.9.2014, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: нет
Всего: 31



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

Код
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 + " ");
                }
            }
        }
    }
}



--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
jonie
Дата 19.9.2014, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Miller_time
Дата 20.10.2014, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 8.9.2006
Где: Нижний Новгород

Репутация: нет
Всего: 1



Еще как вариант:

Код

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();
        }
    }
}



--------------------
Мы делаем игрыЗДЕСЬ
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.