Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Haskell] Сортировка списка случайных чисел 
V
    Опции темы
110393
Дата 20.3.2011, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте.
Помогите пожалуйста в решении следующей задачи: написать программу, которая сортирует(в порядке возрастания) список случайно сгенерированных чисел. При этом, в функцию вводится только размер списка(т.е. количество чисел), например sortRandom 15 - генерирует и тут же сортирует 15 случайных чисел. Сортировать нужно с помощью quick sort, merge sort, insert sort, bubble sort и selection sort.

Коды, необходимые в решении прикрепляю ниже

функция-генератор случайного списка:

Код

rl :: Int -> [Int]
rl size  = take size randSeq

nextRand :: Int -> Int
nextRand n = (multiplier * n + increment) `mod` modulus

randSeq :: [Int]
randSeq  = iterate nextRand seed

seed :: Int
multiplier :: Int
increment :: Int
modulus :: Int

seed        = 17489
multiplier  = 25173
increment   = 13849
modulus     = 65536


quick sort:

Код

qsort []      = []
qsort (p:xs)  = qsort xs1  ++  [p]  ++  qsort xs2
                where  xs1 = [x | x <- xs, x <= p] 
                       xs2 = [x | x <- xs, x > p]




insert sort:

Код

isort :: [Int] -> [Int]
isort [] = []
isort (x:xs) = insert x (isort xs)

insert :: Int -> [Int] -> [Int]
insert x [] = [x]
insert x (y:ys)
    |x <= y    = x:y:ys
    |otherwise = y:(insert x ys)



merge sort:

Код

msort :: [Int] -> [Int]
msort []   =   []
msort [x]  =   [x]
msort xs   =   merge (msort xs1)  (msort xs2)
           where xs1 = take k xs
                 xs2 = drop k xs
                k   = length xs `div` 2 

merge :: [Int] -> [Int] -> [Int] 
merge [] xs     =   xs
merge xs []     =   xs
merge (x:xs) (y:ys)
      |x <= y       = x : merge xs (y:ys)
      |otherwise   = y : merge (x:xs) ys 



selection sort 

Код

ssort :: [Int] -> [Int]
ssort [] = []
ssort xs = m : ssort (delete m xs)
       where m = minimum xs

delete :: Eq a => a -> [a] -> [a]
delete deleted xs = [ x | x <- xs, x /= deleted ]



bubble sort:

Код

bsort :: [Int] -> [Int]
bsort []        = []
bsort [x]        = [x]
bsort xs        = bsort zs ++[m]
   where ys        = bpass xs
         (m:ws)        = reverse ys
         zs        = reverse ws
 
bpass :: [Int] -> [Int]
bpass [x]        = [x]
bpass (x:y:rest)
    | x <= y    = x:bpass(y:rest)
    | otherwise    = y:bpass(x:rest)a


Заранее спасибо за любую помощь

Это сообщение отредактировал(а) 110393 - 20.3.2011, 01:36
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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