Мені потрібна програма, де користувач вводить масив подвійних і програма виводить масив, відсортований


280

Примітка. Це питання було сильно відредаговане з моменту його першого публікації. Правила були перенесені сюди , прочитайте їх, перш ніж публікувати будь-яку відповідь, щоб зрозуміти мету цього. Це було перше питання, створене в категорії .

Уявіть, що ледачий користувач у Stack Overflow задає це питання:

Мені потрібна програма, де користувач вводить масив подвійних і програма виводить масив, відсортований. Скажіть, будь ласка, код?

Як ви могли створити фрагмент коду, який буде тролювати цього користувача? Створіть фрагмент коду, який здасться корисним недосвідченому програмісту, але є абсолютно марним на практиці.

Переможець - найбільш відповідна відповідь, за винятком випадків, коли відповідь якимось чином не підходить (на вимоги щодо відповідності, перевірте тег wiki опис ). Якщо в майбутньому відповідь, яка найбільше обґрунтовується, після її прийняття буде побита в кількості оновлених, нова найкраща відповідь приймається, а попередня - неприйнята. Що стосується нічовини, я виберу переможця за бажанням серед прив'язаних або просто зачекаю ще трохи.

Відповіді, які не мають коду, не є прийнятними. Можливо, вони будуть веселі та отримають кілька грошей, але їх не приймуть.

Правила можна знайти в описі тегів .

Примітка. Це запитання щодо . Будь ласка, не сприймайте питання та / або відповіді серйозно. Більше інформації тут .



6
@bluesm Якщо хтось вже вирішив попросити когось іншого вирішити свою проблему замість того, щоб "витрачати" власний час на навчання, розміщення посилання на те, де вони можуть самостійно вчитися, не принесе користі.
IQAndreas

3
Нічого собі, це питання збирається отримати 100 оновлень та 10000 переглядів менш ніж за 24 години!
Джо З.

18
Боже мій, Вікторе, твоя скринька про нас так сумна ... у всіх нас підйоми і падіння, але ти не повинен бити себе людиною. Ти герой для Кодеків Гольфістів зараз скрізь!
SimonT

4
Я здивований , що ніхто не запропонував рішення , засноване на сон начебто ще
Frank Farmer

Відповіді:


178

Іноді громада тут не любить допомагати з домашніми завданнями. Ось чому ви отримуєте так багато жартівливих відповідей. Але я люблю допомагати. Ось повне рішення в "С" (оскільки я припускаю, що ви хочете навчитися "програмуванню", а не "сценарію" за допомогою Java або Ruby). Я включив багато порад, які б хотілося знати, коли я вперше вчився

#include <stdio.h>

//Always use meaningful names for types
typedef unsigned char boolean;
#define True 't'
#define FALSE (!True)

//this is a really neat trick for swapping values efficiently
void swap(long* a,long *b) { *a=*a^*b;*b=*b^*a;*a=*a^*b; }

//Here's a readability improvement
#define until(condition) while(!(condition))

int main(int n, char*args[]){
  double *d;
  int i;
  char input[5];  //should be long enough for most doubles.
  boolean sorted = FALSE;

  //In C, you need to specify the array size beforehand, so ask
  printf("Please enter the length of the array\n");
  gets(input);
  //scan the input string and convert to a value
  sscanf(input,"%s",&input[0]);
  n=(long)atol(input);

  //allocate space, make sure you get the order of arguments right.
  d = calloc(sizeof(double),n); 

  //Get and sort the array
  until (sorted) {

     for (i=0;i<n;i++) {
        //It's important to always ask nicely
        printf("Please enter the %d%s array item\n",i,i==1?"st":"th");
        scanf("%lf",d+i);
     }
     //do a compare and exchange sort:
     sorted = !sorted;  //not sorted
     //check all the items
     printf("%d %d\n",i,n);
     for (i=1;i<n;i++) {
        //compare
        if (d[i]<d[i-1]) {
          //exchange 
          swap(d+i,d+i-1);
          sorted = FALSE;
        }
     }
     //show results
     printf("The array is%ssorted\n",sorted?" ":" not "); }
  //use the --> "downto operator" for counting downto 0. 
  for (;n-->0;) printf("%lf\n",*d++);
  }

32
майже всі поради неправильні, і він просто запитує список введення, поки ви не введете його вже відсортовано.
AShelly

47
+1, для 1st, 2th, 3th, 4th...оператора downto - дуже вдосконалені методи програмування С.
Кая

5
Якщо використовувати sscanf(input, "%5s", &input[0]), інакше під час розбору входу можуть виникнути перевиконані помилки. І вхід повинен бути оголошений char input[sizeof(int)+1]для зворотної сумісності з 64-бітовими системами.
sh1

12
i==1?"st":"th"ха-ха ...
Гай Сіртон

15
У Java є збір сміття. Тому Java призначена для "сценаріїв", а не для реального програмування. Це базовий CS101. (так каже троль.)
AShelly

181

Ось воно в яві. Це суцільне обману, неприйнятне і нефіксируемое, оскільки воно створює базу даних MySQL, вставляє номер там, робить вибір із пунктом ORDER BY і виводить числа, задані MySQL. Насправді сортування проводить саме MySQL, а не програма.

package sorter;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class SortingAlgorithm {

    private static final String CREATE_DB = "CREATE DATABASE sorting";
    private static final String DROP_DB = "DROP DATABASE sorting";
    private static final String CREATE_TABLE = "CREATE TABLE sorting.sorting ( num double not null )";

    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        List<Double> doubles = new ArrayList<>(50);
        String typed;
        do {
            typed = JOptionPane.showInputDialog(null, "Type a double:");
            if (typed != null) doubles.add(Double.parseDouble(typed));
        } while (typed != null);

        List<Double> sorted = new ArrayList<>(50);

        try (Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306", "root", "root")) {
            try (PreparedStatement ps = con.prepareStatement(CREATE_DB)) {
                ps.executeUpdate();
            }
            try (PreparedStatement ps = con.prepareStatement(CREATE_TABLE)) {
                ps.executeUpdate();
            }

            for (Double d : doubles) {
                try (PreparedStatement ps = con.prepareStatement("INSERT INTO sorting.sorting (num) VALUES (" + d + ")")) {
                    ps.executeUpdate();
                }
            }

            try (
                    PreparedStatement ps = con.prepareStatement("SELECT * FROM sorting.sorting ORDER BY num");
                    ResultSet rs = ps.executeQuery())
            {
                while (rs.next()) {
                    sorted.add(rs.getDouble("num"));
                }
            }
            try (PreparedStatement ps = con.prepareStatement(DROP_DB)) {
                ps.executeUpdate();
            }
        }

        JOptionPane.showMessageDialog(null, "The array sorted is: " + sorted);
    }
}

103
Це насправді трохи занадто близько до дому, тому що багато кодерів Java вважають прийнятною відповідність рішення специфікації !!
Доктор Ребму

10
Також розглянемо випадок, коли потрібно сортувати дуже велику кількість об’єктів. Сортування їх "поза програмою" в базі даних - це прийнятне рішення.
Віктор Сейферт

40
Тут недостатньо абстракції. Вам потрібно щонайменше 10 інтерфейсів, 20 реалізацій, перерахунків, тестів на блок, тести покриття, Maven, інтеграційні тести,
макети

6
@NaftuliTzviKay Ми повинні створити MySQLSortEnterpriseEdition для реалізації вашої ідеї. Чи погодиться Віктор на отримання GPL-ліцензії коду тут, щоб ми могли розпочати роботу?
Джо З.

14
@JoeZ. Так, у моїй відповіді відсутні коментарі щодо ліцензійної моделі, і я повинен змусити користувача прийняти EULA на початку програми. Але оскільки я віддаю його в ледачий OP, він безкоштовний для некомерційного використання, в тому числі корисний для створення довгоочікуваної премії MySQLSortEnterpriseEdidtion.
Віктор Стафуса

142

C # - Не існує вбивства, як надмірність

Перш за все, шановний GiMmEtHaCoDeZ, спробуємо розбити ваше завдання:

  1. Прочитайте числа
  2. Сортуйте їх
  3. Виведіть відсортовані числа.

Оскільки "Розділяй та перемагай" дуже важлива стратегія роботи з проблемами програмного забезпечення, давайте вирішувати їх по черзі

1. Читання

Ще одна важлива проблема програмного забезпечення - універсальність. Оскільки не визначено, як користувач буде вводити цифри, це може статися через консоль, через файл, через веб-сервіс тощо. Можливо, навіть якийсь метод, про який ми не можемо придумати на даний момент. Отже, важливо, щоб наше рішення змогло вмістити різні типи вводу. Скажімо, найпростішим способом цього є вилучення важливої ​​частини в інтерфейс

public interface IDoubleArrayReader
{
  IEnumerable<double> GetDoubles();

  DoubleArrayReaderType Type {get;}
}

де DoubleArrayReaderTypeнаведено перерахування

public enum DoubleArrayReaderType
{
  Console,
  File,
  Database,
  Internet,
  Cloud,
  MockService
}

Також важливо зробити програмне забезпечення тестуваним з нуля, тому реалізація інтерфейсу буде

public class MockServiceDoubleArrayReader : IDoubleArrayReader
{
    IEnumerable<double> IDoubleArrayReader.GetDoubles()
    {
      Random r = new Random();  
      for(int i =0; i<=10; i++)
      {
        yield return r.NextDouble();
      }
    }

    DoubleArrayReaderType IDoubleArrayReader.Type 
    {
      get
      {
        return DoubleArrayReaderType.MockService;
      }
    }
}

Далі логічним питанням є те, як ми будемо знати відповідне завантаження IDoubleArrayReaderу код. Це легко, якщо ми використовуємо просту фабрику:

public static class DoubleArrayInputOutputFactory
{
  private static Dictionary<DoubleArrayReaderType, IDoubleArrayReader> readers;

  static DoubleArrayInputOutputFactory()
  {
      readers = new Dictionary<DoubleArrayReaderType, IDoubleArrayReader>();
      foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
      {
        try
        {
          var instance = Activator.CreateInstance(type);
          if (instance is IDoubleArrayReader)
          {
            readers.Add((instance as IDoubleArrayReader).Type, 
                        (instance as IDoubleArrayReader));
          }
        }
        catch
        {
          continue;
        }
      }
  }

  public static IDoubleArrayReader CreateDoubleArrayReader(DoubleArrayReaderType type)
  {
    return readers[type];
  }
}

Зауважте, що ми використовуємо роздуми для завантаження всіх активних читачів, тому будь-які майбутні розширення будуть автоматично доступні Зараз, в основному корпусі вихідного коду, що ми робимо:

IDoubleArrayReader reader = DoubleArrayInputOutputFactory
                           .CreateDoubleArrayReader(DoubleArrayReaderType.MockService);
var doubles = reader.GetDoubles();

2. Обробка (сортування)

Тепер нам потрібно обробити, тобто сортувати отримані нами числа. Зауважте, що етапи абсолютно не залежать один від одного, тому для підсистеми сортування не має значення, як були зараховані числа. Крім того, поведінка щодо сортування також є предметом змін, наприклад, нам може знадобитися ввести більш ефективний алгоритм сортування. Тож, природно, ми витягнемо запитану поведінку обробки в інтерфейсі:

public interface IDoubleArrayProcessor
{
  IEnumerable<double> ProcessDoubles(IEnumerable<double> input);

  DoubleArrayProcessorType Type {get;}
}

public enum DoubleArrayProcessorType
{
  Sorter,
  Doubler,
  Tripler,
  Quadrupler,
  Squarer
}

І поведінка сортування просто реалізує інтерфейс:

public class SorterDoubleArrayProcessor : IDoubleArrayProcessor
{
    IEnumerable<double> IDoubleArrayProcessor.ProcessDoubles(IEnumerable<double> input)
    {
      var output = input.ToArray();
      Array.Sort(output);
      return output;
    }

    DoubleArrayProcessorType IDoubleArrayProcessor.Type 
    {
      get
      {
        return DoubleArrayProcessorType.Sorter;
      }
    }
}

Звичайно, нам знадобиться фабрика для завантаження та управління екземплярами обробки.

public static class DoubleArrayProcessorFactory
{
  private static Dictionary<DoubleArrayProcessorType, IDoubleArrayProcessor> processors;

  static DoubleArrayProcessorFactory()
  {
      processors = new Dictionary<DoubleArrayProcessorType, IDoubleArrayProcessor>();
      foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
      {
        try
        {
          var instance = Activator.CreateInstance(type);
          if (instance is IDoubleArrayProcessor)
          {
            processors.Add((instance as IDoubleArrayProcessor).Type, (instance as IDoubleArrayProcessor));
          }
        }
        catch
        {
          continue;
        }
      }
  }

  public static IDoubleArrayProcessor CreateDoubleArrayProcessor(DoubleArrayProcessorType type)
  {
    return processors[type];
  }

}

3. Написання виводу

Тут нічого не можна сказати, оскільки це процес, який відображає вхід. Насправді ми могли б поєднати фабрики для читання та запису в єдину DoubleArrayInputOutputFactory, як це:

public interface IDoubleArrayWriter
{
  void WriteDoublesArray(IEnumerable<double> doubles);

  DoubleArrayWriterType Type {get;}
}

public enum DoubleArrayWriterType
{
  Console,
  File,
  Internet,
  Cloud,
  MockService,
  Database
}

public class ConsoleDoubleArrayWriter : IDoubleArrayWriter
{
    void IDoubleArrayWriter.WriteDoublesArray(IEnumerable<double> doubles)
    {
      foreach(double @double in doubles)
      {
        Console.WriteLine(@double);
      }
    }

    DoubleArrayWriterType IDoubleArrayWriter.Type 
    {
      get
      {
        return DoubleArrayWriterType.Console;
      }
    }
}


public static class DoubleArrayInputOutputFactory
{
  private static Dictionary<DoubleArrayReaderType, IDoubleArrayReader> readers;
  private static Dictionary<DoubleArrayWriterType, IDoubleArrayWriter> writers;

  static DoubleArrayInputOutputFactory()
  {
      readers = new Dictionary<DoubleArrayReaderType, IDoubleArrayReader>();
      writers = new Dictionary<DoubleArrayWriterType, IDoubleArrayWriter>();
      foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
      {
        try
        {
          var instance = Activator.CreateInstance(type);
          if (instance is IDoubleArrayReader)
          {
            readers.Add((instance as IDoubleArrayReader).Type, (instance as IDoubleArrayReader));
          }
        }
        catch
        {
          continue;
        }
      }

      foreach (Type type in Assembly.GetExecutingAssembly().GetTypes())
      {
        try
        {
          var instance = Activator.CreateInstance(type);
          if (instance is IDoubleArrayWriter)
          {
            writers.Add((instance as IDoubleArrayWriter).Type, (instance as IDoubleArrayWriter));
          }
        }
        catch
        {
          continue;
        }
      }

  }

  public static IDoubleArrayReader CreateDoubleArrayReader(DoubleArrayReaderType type)
  {
    return readers[type];
  }

  public static IDoubleArrayWriter CreateDoubleArrayWriter(DoubleArrayWriterType type)
  {
    return writers[type];
  }

}

Збираючи все це разом

Нарешті, наша основна програма просто використає всю цю дивовижність, яку ми вже створили, тому код буде просто таким:

var doubles = reader.GetDoubles();
doubles = processor.ProcessDoubles(doubles);
writer.WriteDoublesArray(doubles);

де, наприклад , ми могли б визначити reader, writerі processorвикористовуючи

IDoubleArrayReader reader = DoubleArrayInputOutputFactory.CreateDoubleArrayReader(DoubleArrayReaderType.MockService);
IDoubleArrayProcessor processor = DoubleArrayProcessorFactory.CreateDoubleArrayProcessor(DoubleArrayProcessorType.Sorter);
IDoubleArrayWriter writer = DoubleArrayInputOutputFactory.CreateDoubleArrayWriter(DoubleArrayWriterType.Console);

49
Lol, ListSort Enterprise Edition © :-P +1
Doorknob

14
+1 за шалене перекодування. Я пропоную вам розбити свою відповідь на 3 чи більше відповіді на "модуль", щоб я міг поставити їм +1 окремо
greggo

15
А вишня зверху полягає в тому, що вона фактично використовує сортування бібліотеки :) Це повністю до специфікації та абсолютно марно
SWeko

9
Це ... було ... прекрасно.
Андрій

7
Використання DI просто заплутає OP, оскільки це лише швидкий приклад.
SWeko

132

Ще більш буквальне тлумачення:

echo " aaehrrty"

тобто сортується "масив".


5
Я прийшов сюди, щоб опублікувати це.
Квомплусон

5
зберегти як файл sort.shі зателефонувати якsh sort.sh "an array of doubles"
Kyss Tao

Я думаю, ви пропустили "користувач вводить масив парних".
Герцогство

1
@Dukeling - це суть коментаря Kyss Tao. "an array of doubles"може бути передано до сценарію як аргумент командного рядка.
AJMansfield

108

Perl

З усіх речей, які я робив для CodeGolf.SE, на це, ймовірно, пішло найбільше часу, принаймні кілька годин.

$_[0]=eval<>;
for(0..$#{$_[0]}**2){
 @_[$#_+1]=[\(@{$_[$#_]}),$#{$_[$#_]}+1];
 for(1..$#{$_[$#_]}-$#_){
  if(eval('${'x$#_.'@{$_[$#_]}[$_-1]'.'}'x$#_)>eval('${'x$#_.'@{$_[$#_]}[$_]'.'}'x$#_)){
   ${$_[$#_]}[$#{$_[$#_]}]=$_;
  }
 }
 (${$_[$#_]}[${$_[$#_]}[$#{$_[$#_]}]-1],${$_[$#_]}[${$_[$#_]}[$#{$_[$#_]}]])=(${$_[$#_]}[${$_[$#_]}[$#{$_[$#_]}]],${$_[$#_]}[${$_[$#_]}[$#{$_[$#_]}]-1]);
}
for(0..~~@{$_[0]}){
 $\.=eval('${'x$#_.'${$_[$#_]}[$_-1]'.'}'x$#_).','
}
$\=~s/,*$//;$\=~s/^,*//;$\="[$\]";
print;

Введення має форму, [2,4,5,7,7,3]а вихід - форму [2,3,4,5,7,7].

Я не встигаю зараз пояснити ... поверніться пізніше.

У будь-якому випадку, в Perl є щось, що називається анонімний масив. Це масив, але він не має назви. Однак ми знаємо, що це вказівка ​​(місце пам'яті). Серія чисел у квадратних дужках створює анонімний масив, і він повертає посилання на нього.

Ця відповідь складається з серії анонімних масивів, посилання на які зберігаються в @_. Вхід перетворюється на анонімний масив. Потім ми створюємо інші анонімні масиви, кожен елемент яких є посиланням на елемент у попередньому масиві. Замість того, щоб сортувати елементи в масиві, ми сортуємо покажчики на елементи в цьому масиві. Також ми створюємо новий масив для кожного кроку (і більше) в операції сортування.


3
зло! зло! зло!
DGM

56
про такий же розшифрований, як і будь-який інший сценарій Perl для мене :)
Corey Goldberg

6
@swelljoe Насправді, $_це порожній рядок у цей момент. Я зберігав потрібний вихід у розділі $\ , який є роздільником записів на виході.
PhiNotPi

4
@Andy простий. "Як це працює?"
Джон Дворак

1
і всі створені користувачем змінні мають гарні імена, які дотримуються всіх можливих конвенцій
Hagen von Eitzen

80

Пітон

Надає користувачеві відсортований масив, видаляючи з вхідного масиву всі елементи, не в упорядкованому порядку.

import sys

sorted = []
for number in map(float, sys.stdin.read().split()):
    if not sorted or number >= sorted[-1]:
         sorted.append(number)
print sorted 

Алгоритм проходить через список лише додаючи кожен елемент, якщо він не зробить список несортованим. Таким чином, вихід є впорядкованим списком, тільки не таким, який містить усі елементи вихідного списку. Якщо оп просто перевіряє, чи список відсортований, він може не помітити, що на виході відсутні значення.


1
Будь ласка, подивіться інші відповіді, перш ніж публікувати свої. Ви повинні додати назву своєї мови. Щоб відповісти на це запитання, вам також потрібно коротко пояснити, що ви робите для тролінгу ОП.
Васі

5
Хе-хе, цей насправді змусив мене сміятися вголос. У всякому разі, я погоджуюся, що трохи краще пояснення було б корисним.
oconnor0

2
Чи подвійний дзвінок до sys.stdin.read()друкарської помилки чи частина реальної тролінг-відповіді? Безумовно, це
зашкодить

Ого, це зло все гаразд.
Сільвердраг

13
O(n)Роду алгоритм. Приємно.
ejrb

65

Баш, 54 символи

Дуже багато відповідей з використанням повільних неефективних мов, таких як C та Python ... давайте трохи прискоримо, запропонувавши рішення для материнської мови всіх сценаріїв: Bash.

Я знаю, про що ти думаєш - Баш навіть не може впоратися з арифметикою з плаваючою комою, так як це буде сортувати, правда? Ну ось, моя реалізація могутнього алгоритму SleepSort:

#!/bin/bash

for i in $@; do echo -n $(sleep $i)$i' '& done
echo "Leveraging the power of your $(grep -c ^processor /proc/cpuinfo) cores to \
sort optimally by spawning $(jobs -l | wc -l) concurrent sorting threads..."
wait
echo -e "\nThe array sorted."

Програма надається введенням в якості аргументів командного рядка. Проба зразка:

> ./sleepsort.sh 7 1 4 3 2.752 6.9 0.01 0.02
Leveraging the power of your 4 cores to optimally by spawning 8 concurrent sorting threads...
0.01 0.02 1 2.752 3 4 6.9 7
The array sorted.

Це також має перевагу, можливо, що це найкоротший з усіх представлених тут алгоритмів. Правильно - один могутній рядок bash , використовуючи лише bash вбудовані файли та не викликаючи жодних зовнішніх бінарних файлів (тобто, якщо ви не рахуєте чисто необов'язковий багатослівний вихід). На відміну від богосортів, час його виконання є детермінованим.

Порада: Ефективна оптимізація - це ділення вхідних чисел на коефіцієнт перед сортуванням. Реалізація залишається за читачем.

Редагувати:

Скорочена версія 54-char гольфу з менш симпатичним друком:

#!/bin/sh
for i in $@;do echo $(sleep $i)$i&done;wait

11
Тролінг 1: Алгоритм працює, але, очевидно, потенційно надзвичайно повільний - він породжує нитку для кожного числа, спить за цю кількість секунд, перш ніж виводити число (яке, таким чином, в порядку). Тролінг 2: Крім того, більша частина коду витрачається на написання приємного коментаря про те, скільки ниток його нерестує, а також непотрібно і безоплатно читає та аналізує інформацію щодо процесора системи лише заради додаткового багатослівного виведення. Тролінг 3: Виводить "відсортований масив" наприкінці, що, здається, зроблено. Тролінг 4: Користувач не може скасувати "сортування", натиснувши ctrl-c.
Бунт

4
5. Він працює лише в GNU / Linux , завдяки використанню /proc/cpuinfo.
kps11346

5
Надзвичайно креативне рішення, до речі :)
dmitry

8
Це дивно. Я навіть не можу висловити, наскільки це приголомшливо. Я думаю про те, щоб використовувати це активно, бо ЧОМУ НЕ.

4
Я справді справді маю такий варіант, який використовується десь у виробництві. Але в цій ситуації важливий час виконання цього процесу, тому це моє виправдання ...
Бунт

64

У JavaScript є вбудована sort()функція, ви можете використовувати її так:

var numbers = [6, 2.7, 8];
numbers.sort();
// => [2.7, 6, 8]

... о, зовсім забув згадати, він сортує в лексикографічному порядку, тобто 10 < 9і 9 < -100. Напевно, саме цього ви і очікуєте.


8
Це ще краще, оскільки це вбудована функція.
Уейн Вернер

62

(jPL) Мова програмування jQuery

Ви повинні використовувати jQuery для цього. Просте рішення цієї проблеми:

function jSort() {
    var a = 0.0; // position 1
    var b = 0.0; // position 2
    var c = 0.0; // position 3

    var arr = [];
    var nArr = [];

    // don't forget to validate our array!
    if (window.prompt("You must only type double values. Type 1 if you accept the terms.") != 1) {
        alert("You can't do that.");
        return;
    }

    for (var i = 0; i < 3; i++) {
        if (i == 0) {
            var a = window.prompt("Type a double value");
            arr.push(a);
        }
        if (i == 1) {
            var b = window.prompt("Type a double value");
            arr.push(b);
        }
        if (i == 2) {
            var c = window.prompt("Type a double value");
            arr.push(c);
        }
    }

    // Now the tricky part
    var b1 = false;
    var b2 = false;
    var b3 = false;
    for (var i = 0 ; i < 3; i++) {
        // check if the variable value is the same value of the same variable which now is inside the array
        if (i == 0) {
            if (a == arr[i]) {
                b1 = true;
            }
        }

        if (i == 1) {
            if (b == arr[i]) {
                b2 = true;
            }
        }

        if (i == 2) {
            if (c == arr[i]) {
                b3 = true;
            }
        }
    }

    if (b1 == true && b2 == true && b3 == true) {
        if (arr[0] > arr[1]) {
            if (arr[0] > arr[2]) {
                nArr.push(arr[0]);
            } else {
                nArr.push(arr[2]);
            }
        }

        if (arr[1] > arr[0]) {
            if (arr[1] > arr[2]) {
                nArr.push(arr[1]);
            }
            else {
                nArr.push(arr[2]);
            }
        }

        if (arr[2] > arr[0]) {
            if (arr[2] > arr[1]) {
                nArr.push(arr[2]);
            } else {
                nArr.push(arr[1]);
            }
        }

        console.log(arr.sort(function (a, b) { return a - b }));
        alert(arr.sort(function (a, b) { return a - b }));
    }
}

jSort();


55
Особливо мені подобається , як це не на самому ділі використовувати JQuery.
KRyan

8
-1 Вашого масив імен повинні включати в себе угорське позначення в ньому, в зокрема об'єктів JQuery означали , використовуючи $, масиви , використовуючи aі результати , window.promptяк p.
Qantas 94 Важка

2
«Хитра частина» елегантна. ОП, прагнути мати таку структуру коду колись.
Кріс Баркер

2
Цей F'n Doble "валідація" LOOOOOOOOOOOOL omg omg день зроблений! відредаговано на менші шапки
HC_

54

С

Це рішення поєднує стислість та доступ на рівні ОС, що надаються компанією C, з потужними програмними компонентами, що використовуються багаторазово, в GNU / Linux:

#include <stdlib.h>

main(int argc, char **argv)
{
    system("echo Enter numbers one per line, ending with ctrl-D; sort -g");
}

4
Або «сценарій»: #!/usr/bin/sort.
Механічний равлик

54

Рубін

print "Input an array of doubles: "
gets
puts "the array sorted."

Досить зрозуміло.

Або вимагати, щоб вхід фактично був "масивом подвійних":

print "Input an array of doubles: "
g = gets until /an array of doubles\n/
puts "the array sorted."

Не використовувати gets.chompдля додаткової зла. Також використовую регулярний вираз після трейлінгу до, що я навіть не знав, що ти можеш зробити (дякую Яну Двороку), щоб ще більше заплутати ОП!


4
Розширюючи ідею, я не раз просив би ввести, поки користувач не введе рядок an array of doubles.
Wrzlprmft

@Wrz Добре, зроблено :-)
Doorknob

2
Це надзвичайно чудово, тому що бідним ОП доведеться розібратися, як позбутися нового рядка (тому що ви використовуєте getsзамість цього gets.chomp).
wchargin

@WChargin Так, я мав це в першій редакції (див. Історію редакції), але видалив це, щоб бути ще більшим злом>: D EDIT: О, чекайте, не забувайте, це була моя інша відповідь. Я відредагую цей :-)
Doorknob

1
+1 Я створив тут обліковий запис, щоб сказати, саме так я би відповів на нього! Любіть це!
DGM

44

Python3.3

Звичайно, ось найпростіша програма Python, яка може сортувати масив, заданий як літеральний список на stdin:

collections = __import__(dir(object.__subclasses__()[7])[1][4:-3] + chr(116))

URL = ('https://www.google.com/search?client=ubuntu&channel=fs&q=dante+alighieri'
      '%27s+divina+commedia&ie=utf-8&oe=utf-8#channel=fs&q=__++divina+commedia+'
      'dante+alighieri+inferno+__').translate(
          dict.fromkeys(map(ord, '+-.:,;bcdefghjklopqrstuvwxyz/&=#?%')))[30:]
SECRET_KEY = URL[2:10][::-1][3:-1]
DATA = '{}{}{}'.format(URL[:2], SECRET_KEY[:2] + SECRET_KEY[:-3:-1], URL[-2:])



if getattr(DATA, dir(list)[7])(__name__):
    pieces = 'literally - evil'.split(' - ')
    r = getattr(collections, 
                '_'.join([pieces[0][:-2],
                          pieces[1].translate({ord('j')-1: 'a'})])
                )((getattr(globals()['__{}__'.format('buildings'.translate(
                        {100:'t', 103:None}))], 'in' r"put"))
                  ())
    tuple((lambda lst:
           (yield from map(list,
                           map(lambda k: (yield from k), 
                               ((lambda i: (yield from map(lambda t:
                                             (lst.append(lst[i]) or
                                              lst.__setitem__(i, lst[t]) or
                                              lst.__setitem__(t, lst.pop())),
                                              (j for j in range(i)
                                                if (lambda: lst[i] < lst[j])())
                                              ))
                                )(è) for è in range(
                                                getattr(lst,
                                                        dir(lst)[19])()))))
          )
        )(r))
    print(r)

На жаль, він працює лише в python3.3 +, оскільки використовує yield fromвираз. Код повинен бути досить зрозумілим, тому у вас не повинно виникнути проблем при передачі його своєму професору.


Тролінг полягає у наданні ідеально працюючого рішення, яке робить саме те, що планувала ОП, але таким чином:

  • неможливо зрозуміти (початківець)
  • неможливо звернутися до вчителя, оскільки:
    • ОП не може цього зрозуміти
    • навіть якщо він міг би вчитель, не встиг би розшифрувати, щоб зрозуміти це
  • страшно для наївного новачка, який може подумати, що програмування для нього занадто важке

Підсумовуючи це, ця відповідь значно посилить розчарування учня, що знущається над їхніми запитами ідеально правильними відповідями з певної точки зору.


(Не читайте, якщо ви вважаєте проблемою розуміння коду вище)

Треба додати, що тролінг також збільшується тим, що реалізований алгоритм сортування насправді

міхур-сортування! ... що, безумовно, може бути реалізовано таким чином, що навіть ОП може зрозуміти. Це не зовсім незрозумілий алгоритм, а лише хороша затуманення коду чогось, що ОП може інакше зрозуміти.


3
Я думаю, що це могло б використовувати більше пояснень; що ти зараз робиш з Inferno ?
KRyan

1
Нічого собі, ви можете робити неіменні імена змінних у python? не знав ...
kratenko

1
@kratenko Від python3 +. У python2 інтерпретатор передбачає ASCII як кодування і викликав би помилку. У python3 інтерпретатор передбачає UTF-8 як кодування та приймає всі символи, які є "літерами" за властивостями unicode для ідентифікаторів.
Бакуріу

3
@KRyan: Він, очевидно, використовує метод сортування, який використовує Пекло для залучення людей до дев'яти кіл.
Джо З.

10
Боже мій ... +1 для è.
Шон Аллред

41

C - Повільний, важкий у використанні, неприйнятний стиль кодування

Сам алгоритм сортування відомий як повільний і має найкращу складність випадку (простоту) близько n ^ (log n / 2) . Алгоритм був опублікований Андрієм Бродером та Хорхе Столфі у своїй чудовій роботі "Песимальний алгоритм та аналіз простоти", яку я дуже рекомендую для доброго сміху та їжі для роздумів.

void sort(double* arr, int n, int i, int j)
{
        if(i < j) {
                int m = (i+j)/2;
                sort(arr, n, i  , m);
                sort(arr, n, m+1, n);
                if(arr[m] > arr[j]) {
                        double t = arr[j];
                        arr[j] = arr[m];
                        arr[m] = t;
                }
                sort(arr, n, i, j-1);
        }
}

Однак саме сортування є марним, тому нам потрібен спосіб ввести користувачеві дані, які він хоче сортувати. Розбір парних пар - це біль, то чому б не ввести їх байтом.

const unsigned MAX_ELEMS = 100;
int main()
{
        int i=0, j=0, len;
        char a[MAX_ELEMS*8];
        double* arr = (double*) a;
        short isNull=1;

        while(1) {
                a[i++] = getchar();
                if(i%8 == 0) {
                        if(isNull)
                                break;
                        isNull = 1;
                }
                else if(a[i-1] != 0)
                        isNull = 0;
        }

        len=i/8 - 1;

        sort(arr, len-1, 0, len-1);

        for(i = 0; i < len; i++)
        {
                printf("%f ", arr[i]);
        }
}

Щоб довести, що це працює:

 $ gcc -g trollsort.c -o trollsort
trollsort.c: In function ‘main’:
trollsort.c:43:3: warning: incompatible implicit declaration of built-in function ‘printf’
 $ echo -en "\0\0\0\0\0\xe4\x94\x40\0\0\0\0\0\0\xf0\x3f\0\0\0\0\0\0\x45\x40\0\0\0\0\0\0\0\0" | ./trollsort
1.000000 42.000000 1337.000000

Зрештою, ми маємо:

  • Найповільніший детермінований алгоритм сортування, про який я знаю
  • Мовчазні жорсткі обмеження щодо довжини списку
  • Абсолютно жахливий внесок, я також міг зробити подібний вихід, але я думаю, що це смішніше.
    • Поміркуйте: Вам потрібно буде знати, якою виправданістю ваш апарат користується програмою.
    • Також ви не можете ввести 0 (-0 в порядку)
  • Арифметика вказівника і майже не турбується про типи, оскільки покажчики подаються в будь-який спосіб

Це не визначене поведінка для всіх входів більше 7 байт. Не прийнятна відповідь.
Майкл Спенсер

1
Любіть папір «Песимічні алгоритми»; Дякую.
Райан

«Самий повільний детермінований алгоритм сортування Я знаю» - доказово повільним алгоритм детермінованою сортування. У цьому вся суть статті, AFAIR.
Конрад Рудольф

@MichaelSpencer Догляд докласти? Я наводив приклад з розміром вводу 24 байти, і вихід - це те, чого можна було б очікувати (я думаю, тут я, можливо, не вистачає жарту).
shiona

2
@Sasho, але сорт bogo має найкращий час роботи \ Omega (n) (n-1 порівняння, 0 операцій). Це набагато швидше, ака. гірше, ніж \ Омега (n ^ (log n / 2)).
shiona

39

Рубі, злий Богосорт! (Бонус: Богоссор по введенню користувача)

print "Input array of doubles, separated by commas: "
arr = gets.split(",")
arr.shuffle! until arr.each_cons(2).all? {|x| x[0] < x[1]}
puts arr * ","

"Злі" повороти:

  • працює, дійсно, дійсно, дійсно, дійсно, дійсно дуже повільно, звичайно
  • використовує порівняння рядків, тому 10 менше, ніж 2. Можна легко зафіксувати, .map &:to_fдодавши до другого рядка, але ОП може цього не знати
  • не використовується, chompтому останній номер має таємничий новий рядок в кінці
  • не використовується, stripтому є таємничий пробіл навколо чисел, якщо вводиться з пробілами навколо коми (наприклад, пробіл у 1.5, 2)

Або як щодо богосортування за допомогою введення користувача ?! >: D

print "Input array of doubles, separated by commas: "
arr = gets.split(",")
arr.shuffle! until arr.each_cons(2).all? {|x|
    print "Is #{x[0]} less than #{x[1]}? (y/n) "
    gets =~ /y/
}
puts arr * ","

Чому б не богобогосорт ? (працює у вигадливий час O (n * (n! ^ ^ n))
wchargin

@Wchargin Я можу це врахувати :-) Вас може зацікавити моя остання редакція! (Вибачте за те, що я повільний, я фактично перебуваю на своєму телефоні зараз, оскільки не можу отримати доступ до комп'ютера :-P)
Doorknob

37

КОБОЛ

Звичайно! "Навіть мавпа може це зробити!"

Ось проста програма COBOL, яка буде сортувати дані для вас. Прочитайте коментарі, щоб побачити, наскільки це банально та розтяжно. Справжня перевага цього полягає в тому, що це перевірений і справжній механізм, він не покладається на нові та відносно неперевірені мови, як Java, і що-небудь на базі Інтернету чи від Microsoft. Він збирається дійсно ефективно, а подібні процедури використовуються найбільш успішними фінансовими компаніями Fortune500 та іншими лідерами галузі. Цей код було розглянуто багатьма експертами і визнано відмінним механізмом сортування.

000100 IDENTIFICATION DIVISION.
000200* Cobol sort. Consistent with COBOL 390
000300* does not use sections; does not use go to
000400* uses sort procedures
000500* does a sort with some minimal input validation
000600* since everything is done in an orderly way,
000700* you can easily add code of your own to this program
000800 PROGRAM-ID. 'SORTEX1'.
000900 ENVIRONMENT DIVISION.
001000 CONFIGURATION SECTION.
001100 INPUT-OUTPUT SECTION.
001200 FILE-CONTROL.
001300*    INPUT FILE UNSORTED
001400     SELECT UNSORTED-FILE ASSIGN UNSORTED.
001500*    The work file for the sort utility
001600*    you need the select and an sd but do not need jcl for it
001700     SELECT SORT-WORK      ASSIGN      SORTWORK.
001800*    output file normally a disk/tape file
001900*    for this program, send it to the printer
002000     SELECT SORTED-FILE ASSIGN SORTED.
002100*
002200 DATA DIVISION.
002300 FILE SECTION.
002400*
002500 FD  UNSORTED-FILE
002600     RECORDING MODE IS F
002900     RECORD CONTAINS  80 CHARACTERS.
003000
003100 01  UNSORTED-RECORD.
003200     05  WS-UR-ACCT-NO        PIC X(5).
003300     05  FILLER               PIC X(5).
003400     05  WS-UR-AMOUNT         PIC 9(5).
003500     05  WS-UR-CUST-NAME      PIC X(10).
003600     05  FILLER               PIC X(5).
003700     05  WS-UR-TRANS-CODE     PIC X(1).
003800     05  FILLER               PIC X(49).
003900
004000  SD  SORT-WORK
004400      RECORD CONTAINS  80 CHARACTERS.
004500*
004600 01  SORT-WORK-RECORD.
004700*    You need a definition and picture for
004800*    the field that is sorted on (sort key)
004900     05  SW-ACCT-NO    PIC X(05).
005000*    YOU NEED A FILLER TO COMPLETE THE DEFINITION
005100     05  FILLER        PIC X(75).
005200*
005300 FD  SORTED-FILE
005400     RECORDING MODE IS F
005700     RECORD CONTAINS  80 CHARACTERS.
005800*
005900 01  SORTED-RECORD.
006000     05  WS-SR-ACCT-NO        PIC X(05).
006100     05  FILLER               PIC X(05).
006200     05  WS-SR-AMOUNT         PIC 9(05).
006300     05  WS-SR-CUST-NAME      PIC X(10).
006400     05  FILLER               PIC X(55).
006500
006600 WORKING-STORAGE SECTION.
006700 01  SWITCHES.
006800     05  UNSORTED-FILE-AT-END      PIC X   VALUE 'N'.
006900     05  SORT-WORK-AT-END          PIC X   VALUE 'N'.
007000     05  valid-sw                  PIC X   VALUE 'N'.
007100
007200 01  COUNTERS.
007300      05 RELEASED-COUNTER PIC S9(7)
007400                PACKED-DECIMAL VALUE +0.
007500      05 REJECT-COUNTER   PIC S9(7)
007600                PACKED-DECIMAL VALUE +0.
007700
007800 PROCEDURE DIVISION.
007900     PERFORM INITIALIZATION
008000*    Compare this logic to that of the simple program
008100*    notice how the sort verb replaces the
008200*    perform main until end of file etc
008300     SORT SORT-work ASCENDING KEY SW-ACCT-NO
008400         INPUT PROCEDURE SORT-INPUT
008500         OUTPUT PROCEDURE SORT-OUTPUT
008600     PERFORM      TERMINATION
008700     GOBACK.
008800
008900 INITIALIZATION.
009000*    Do what you normally do in initialization
009100*    open the regular input file (not the sort work file)
009200*    and other files needed
009300*    (you could open them in the sort input procedure, too)
009400     OPEN INPUT UNSORTED-FILE
009500          output SORTED-FILE
009600*    READ THE FIRST RECORD ON THE REGULAR INPUT FILE
009700     PERFORM READ-IT.
009800*    Whatever else you do in initialization
009900*    headers, initialize counters, etc
010000
010100 TERMINATION.
010200*    Do what you normally do in termination
010300*    print out total lines
010400*    close the files you opened
010500*    display totals
010600     CLOSE UNSORTED-FILE
010700           SORTED-FILE.
010800
010900 READ-IT.
011000     READ UNSORTED-FILE
011100     AT END MOVE 'Y' TO UNSORTED-FILE-AT-END
011200     END-READ.
011300
011400 SORT-INPUT.
011500*    This is the 'sort input procedure'
011600*    when control passes thru the last statement in it
011700*    the input phase of the sort is finished
011800*    and actual sorting takes place
011900     PERFORM SORT-INPUT-PROCESS-ALL
012000        UNTIL UNSORTED-FILE-AT-END = 'Y'.
012100
012200  SORT-INPUT-PROCESS-ALL.
012300*  This is the point when you have each unsorted input record
012400*  in your hands
012500*  many programs do some validation or selection here
012600*  to determine which records are actually given to the sort util
012700*  we will do some simple validation here
012800     MOVE 'Y' TO VALID-SW
012900     PERFORM SORT-INPUT-VALIDATE
013000     IF VALID-SW = 'Y'
013100     THEN
013200**       Give the unsorted input record to the sort utility
013300         RELEASE SORT-work-RECord FROM unsorted-RECORD
013400         ADD 1 TO RELEASED-COUNTER
013500     ELSE
013600**       Here, you have decided not to give the unsorted input
013700**       record to the sort utility
013800         ADD 1 TO REJECT-COUNTER
013900     END-IF
014000     PERFORM READ-IT.
014100
014200 SORT-INPUT-VALIDATE.
014300*    Check the regular input record for validity.
014400*    if it is not suitable for sorting, set the valid sw
014500*    other validation criteria would apply for other files
014600     IF WS-UR-ACCT-NO IS equal to spaces
014700        THEN MOVE 'N' TO VALID-SW
014800     END-IF.
014900
015000 SORT-OUTPUT.
015100*    This is the 'sort output procedure'
015200*    when control passes thru the last statement in it
015300*    the output phase of the sort is finished
015400*    you have seen (returned) the last sorted record
015500*    and the sort utility is finished
015600     PERFORM RETURN-IT
015700     PERFORM SORT-OUTPUT-PROCESS-ALL
015800         UNTIL SORT-WORK-AT-END = 'Y'.
015900
016000 RETURN-IT.
016100*    Gets each sorted record from the sort utility
016200*    return is logically like a read
016300      RETURN SORT-work
016400         AT END MOVE 'Y' TO SORT-work-AT-END
016500      END-RETURN.
016600
016700 SORT-OUTPUT-PROCESS-ALL.
016800      PERFORM SORT-OUTPUT-PROCESSING
016900      PERFORM RETURN-IT.
017100 SORT-OUTPUT-PROCESSING.
017200* Here you do the things you do in a
017300* regular program's main processing routine
017400* add totals, compute things
017500* write detail records, print lines, etc
017600* you could put control break check here
017700* this program just and writes the record out to "sorted file"
017900     MOVE SORT-WORK-RECORD TO SORTED-RECORD
018100     WRITE SORTED-RECORD.

6
Лише ви би використовували COBOL для відповіді на це питання. +1
syb0rg

5
Ах, свіжий запах перфокарт
Sklivvz

3
@EbenezerSklivvze - LOL. Одного разу я вийняв перфокартку, яку я використовував як закладку, коли мій професор колегії в колекції розповідав класу про старовинні перфокарти. Він був достатньо підлоги (це було в 1994 році :). Не думаю, що багато моїх сучасників коли-небудь бачили цілу колоду ...
DVK

30

ОП ніколи не казав, ЯК сортувати їх ... або те, що його визначення парних. Якщо припустити тип даних, doubleале інтерпретувати його як дублікати . Використання тут.

var arr = [4, 6, 7, 4, 5, 9, 11, 7],
    flag = 1,
    result = [];

while( arr.length ) {
  for( var i = 0, index = 0; i < arr.length; ++i ) {
    if( arr[i] * flag < arr[index] * flag ) {
      console.log(arr[i], arr[index]);
      index = i;
    }
  }
  arr.splice(index, 1);
  flag = -flag;
}

Результат: чергування порядку [4, 11, 4, 9, 5, 7, 6, 7]


4
"Припустимо, що тип даних подвійний, але інтерпретувати його як дублікати". Тільки справді геній міркував би так. Просто геніально!
Феліпе Міоссо

@FelipeMiosso Чесно кажучи, я не впевнений, що ти просто саркастичний ...
Kiruse

1
Ха-ха ... я був саркастичним. Я знаю, що там є люди, які дійсно так думають. У всякому разі ... ваша відповідь була епічною! Я багато сміявся.
Феліпе Міоссо

@FelipeMiosso Радий, що можу допомогти посміятися. ;)
Кірусе

console.log все!
Еміль Вікстрем

28

PHP

Ось повна реалізація з обробкою помилок. Це найшвидший для будь-якого array of doubles.

<?php
  function arraySorter($arr) {
      foreach ($arr as $el) {
          if ($el != 'double') {
              throw new Exception('Unexpected Error: Invalid array!');
          }
      }
      return $arr;
  }

  $arrayOfDoubles = Array('double', 'double', 'double', 'double', 'double');
  var_dump(arraySorter($arrayOfDoubles));
?>

25
do
{
}
while(next_permutation(begin(ar), end(ar)));

Наступна перестановка в C ++ працює, повертаючи true, коли масив сортується та false в іншому випадку (після перестановки). Таким чином, ви повинні сортувати масив, а потім використовувати його в добовому режимі, як зазначено вище (таким чином він зробить повне коло назад до відсортованого масиву).


+1 Я думав використати next_permutationдля своєї відповіді, але це набагато чистіше, ніж те, що я мав на увазі.
jliv902

25

[рішення шляхом пунктуальної помилки]

Будь ласка, прочитайте відповідний стандарт IEC 60559: 1989 Специфікація для двійкової арифметики з плаваючою комою для мікропроцесорних систем , яку ви можете придбати тут . У виносці до § 5.10 Деталі загального присудка Ордера зазначається, що:

totalOrder не накладає загального замовлення на всі кодування у форматі. Зокрема, він не розрізняє різні кодування одного і того ж представлення з плаваючою комою, як коли одне або обидва кодування є неканонічними.

Таким чином ми бачимо, що неможливо написати код для сортування пар. Це хитромудрі питання. Ха-ха, дуже розумно! Скажіть, будь ласка, своєму професору, що мені дуже подобається його курс.

[редагувати: ніщо не вимагає, щоб я не припускав, що проблема вимагає повного замовлення]


3
Але проблема полягала в сортуванні пар. Ніхто не вимагав, щоб значення були в (загальному) порядку. Наприклад, ви можете сортувати масив у два, додатні та від’ємні числа. Вас запитало подвійне питання.
shiona

23

Злий JavaScript:

ОП, я не хочу давати вам все, тому я дозволю вам зрозуміти, як отримати власний внесок від користувача (підказка: використання prompt).

Отримавши це, ось функція, яку ви можете передати масиву для сортування. Вам просто потрібно надати масив, найменше значення в масиві та приріст:

var sortDoubles = function (unsortedArray, minimumVal, increment) {
    var sortedArray = [];

    while (unsortedArray.length != sortedArray.length) {
        var index = unsortedArray.indexOf(minimumVal);
        if (index != -1) {
            sortedArray.push(unsortedArray[index]);
        }

        minimumVal += increment;
    }

    return sortedArray;
};

Ось загадка, щоб побачити це в дії з прикладом введення користувача [1,5, -3,5, 12, 10, -19,5].


Примітка: окрім того, що ця проблема є недостатньо ефективною, складною і незрозумілою, це буде особливо неприємно, якщо ОП не знає математики з плаваючою комою. Наприклад, якщо користувальницьке введення є, [8.1, 5, -.8, 2.3, 5.6, 17.9]а ОП вибирає прямолінійні значення (тобто minimumVal=-.8і increment=.1), програма запускається назавжди. У відповідній замітці я зараз є гордим власником 2 непрацюючих вкладок браузера через цю саму проблему :)

Примітка II: Мені було огидно навіть писати вищевказаний код.

Примітка III: MWA HAHAHAHA!


Хороша ідея. Ви, мабуть, були круті, коли ви ще були початківцем програмуванням.
П'єр Арло

22

Ось фактична відповідь, яка мені подобається для Java:

Додайте рядок до println і ваш масив буде відсортований

Arrays.sort( array );

Ніяких пояснень, бентежить ОП , але працює і отримає відгуки від більш досвідчених програмістів.


Ще одна схожа відповідь :

Погляньте на Arrays.sort ()

Побічно кажучи ОП зробити власне дослідження, даючи йому туманну правильну відповідь. Без подальших досліджень ОП все ще плутається . Мені також подобається, що посилання вказує на старішу документацію.


10
Це корисно і, таким чином, гідне голосування.
emory

11
"Непрямо кажучи ОП зробити власне дослідження, даючи йому невиразну правильну відповідь", в значній мірі описує мій стиль StackOverflow, відповідаючи: /
Corey Goldberg

7
"Погляньте на Arrays.sort ()" ... "Чи можу я отримати приклад, як його використовувати у своїй програмі?" ... блискучий.
SimonT

5
+1 особливо тому, що нашому скромному ОП, ймовірно, потрібно написати сортування для класу, зробивши Array.sort () абсолютно непотрібним для нього / неї.
Кевін

2
Ctrl + F -> "Чи можу я отримати приклад, як його використовувати у своїй програмі?" = 3 результати.
Qix

21

Генетичний алгоритм / Метод Монте-Карло для проблеми сортування в JAVA

Проблема сортування відома обчислювальній науці давно і було знайдено багато хороших рішень. Останніми роками спостерігається великий прогрес у галузі біокомп'ютерів, і вивчення того, як біологія вирішує проблеми, виявило велику допомогу у вирішенні важких проблем. Цей алгоритм сортування використовує найкращі з цих ідей, щоб використовувати їх для вирішення проблеми сортування. Ідея досить проста. Ви починаєте з не упорядкованого масиву і з’ясовуєте, наскільки це вже відсортовано. Ви даєте йому оцінку "впорядкованості", а потім переставляєте масив випадковою складовою - так само, як і в біології, де не ясно, як будуть виглядати діти, навіть якщо ви знаєте все про батьків! Це частина генетичного алгоритму. Ви створюєте нащадок цього масиву, так би мовити. Тоді ви бачите, чи потомство краще сортується, ніж батьківське (він же виживання найбільш придатних!). У такому випадку ви продовжуєте цей новий масив як вихідну точку для побудови наступної перестановки тощо, поки масив не буде повністю відсортований. Класна річ у цьому підході полягає в тому, що він займає коротше, якщо масив вже трохи відсортований від початку!

package testing;

import java.awt.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

import org.joda.time.DateTime;
import org.joda.time.Interval;


public class MonteCarloSort {
    private static final Random RANDOM  = new Random();


    public static void main(String[] args) {


        List doubleList = new java.awt.List();

        //  prompt the user to enter numbers
        System.out.print("Enter a number or hit return to start sorting them!");


        //  open up standard input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String input = null;

        //  read the numbers from the command-line; need to use try/catch !!!
        do{

            try {
                input = br.readLine();
            } catch (IOException ioe) {
                System.out.println("IO error trying to read a number!");
                System.exit(1);
            }


                try {
                    double d = Double.parseDouble(input);
                    doubleList.add(input);
                } catch (NumberFormatException e) {
                    if (!input.equals("")) System.out.println("Only numbers are allowed.");
                }

        } while (!input.equals(""));



        printCurrentListAndStuff(doubleList);

        while (isAscSorted(doubleList) < doubleList.getItemCount()){
            List newlist = createPermutation(doubleList);

            //genetic algorithm approach!
            if (isAscSorted(doubleList) <= isAscSorted(newlist)){
                //the new list is better, so we use it as starting point for the next iteration!
                doubleList = newlist;
                printCurrentListAndStuff(doubleList);

            }

        }

        System.out.println("done!");
    }

    private static void printCurrentListAndStuff(List doubleList){
        System.out.print("array sortedness is now " + isAscSorted(doubleList) + "(max = "+doubleList.getItemCount()+"): ");
        printList(doubleList);
        System.out.print("\n"); 
    }

    private static void printList(List doubleList){
        for (int i = 0; i < doubleList.getItemCount(); i++){
            String doubleVal = doubleList.getItem(i);
            System.out.print((i>0?", ":"") +doubleVal);
        }   
    }

    private static List createPermutation(List doubleList){
        int sortedness = isAscSorted(doubleList);
        if (sortedness == doubleList.getItemCount()) return doubleList;

        //we take the first non fitting item and exchange it by random
        int swapWith = RANDOM.nextInt(doubleList.getItemCount());

        //it makes no sense to swap with itself, so we exclude this
        while (swapWith == sortedness){
            swapWith = RANDOM.nextInt(doubleList.getItemCount());
        }

        List newList = new List();
        for (int i = 0; i < doubleList.getItemCount(); i++){
            if ( i == sortedness){
                newList.add(doubleList.getItem(swapWith));  
            }
            else if ( i == swapWith){
                newList.add(doubleList.getItem(sortedness));    
            }
            else{
                newList.add(doubleList.getItem(i));
            }

        }
        return newList;

    }

    /**
     * A clever method to get the "degree of sortedness" form a given array. the
     * bigger the number the more sorted it is. The given list is fully sorted if
     * the return value is the length of the list!
     * 
     * @param doubleList
     * @return a number
     */
    private static int isAscSorted(List doubleList){
        double current = Double.NEGATIVE_INFINITY;
        for (int i = 0; i < doubleList.getItemCount(); i++){
            String doubleVal = doubleList.getItem(i);
            if (Double.parseDouble(doubleVal) >= current){
                current = Double.parseDouble(doubleVal);
            }
            else{
                return i;
            }
        }
        return doubleList.getItemCount();
    }

}

Екстри

  • Неправильне використання java.awt.List
  • непослідовна і погана імена змінної
  • повністю дурний бла-бла про біокомп'ютери
  • винахідлива і непослідовна мова в поясненні
  • Монте Карло - це явно неправильний інструмент для детермінованих проблем прямого напрямку
  • непотрібний імпорт
  • напевно, більше ласощів ...

Чи називає це GA чи Монте-Карло іншим рівнем тролів? Я вважаю, що це алгоритм рандомізованого сходження на гірку.
shiona

асоціювання цієї програми з іменами модного слова було навмисним, але я ніколи не чув про "алгоритм рандомізованого сходження на гору" ... і в більш широкому сенсі я думаю, що GA та Монте-Карло не надто далеко, щоб бути явно помиляються ...
luksch

19

Пітон

a = map(float, raw_input().split())
print sorted(a, key=lambda x: int(x * 10**3) % 10 + int(x * 10**5) % 10)

Сортує масив (список) за сумою 3- го та 5- го знаків після коми.


5
На жаль, це тривіально виправляється, видаляючи все після lambda x:і замінюючи його x. Все-таки початківець кодер ніколи цього не знав би, тож кудо!
Джо З.

18

C ++

Це працює ... врешті-решт.

Ось мій алгоритм сортування:

template <typename Iterator>
void sort (Iterator first, Iterator last)
{
    while (std::is_sorted (first, last) == false) {
        std::shuffle (first, last, std::random_device()) ;
    }
}

Ось повна програма:

#include <algorithm>
#include <iostream>
#include <random>
#include <string>
#include <sstream>
#include <vector>

namespace professional 
{
    template <typename Iterator>
    void sort (Iterator first, Iterator last) ;

} // end of namespace professional

std::vector <double> get_doubles () ;

int main (void)
{
    std::vector <double> vecVals = get_doubles () ;
    professional::sort (std::begin (vecVals), std::end (vecVals)) ;

    for (const double d : vecVals) {
        std::cout << d << " " ;
    }

    std::cout << std::endl ;

    return 0 ;
}

template <typename Iterator>
void professional::sort (Iterator first, Iterator last)
{
    while (std::is_sorted (first, last) == false) {
        std::shuffle (first, last, std::random_device()) ;
    }
}

std::vector <double> get_doubles ()
{
    std::cout << "Please enter some space delimited doubles." << std::endl ;

    std::vector <double> vecVals ;

    std::string strLine ;
    std::getline (std::cin, strLine) ;

    std::stringstream ss (strLine) ;

    while (1) {
        double d = 0 ;
        ss >> d ;

        if (ss.bad () == false && ss.fail () == false) {
            vecVals.push_back (d) ;
        }

        else {
            break ;
        }
    }

    return vecVals ;
}

6
Твій наче “алгоритм” мене сліз.
Нейт

Так, це не алгоритм, оскільки його не надано для завершення>: D
jmacedo

@joxnas, насправді в системах, де недетерміновані випадкові пристрої недоступні, рандомізатор може насправді бути періодичним. Тоді це буде просто залежати від того, чи набір можливих перестановок, дозволених рандомизатором, підключає набір можливих перестановок $ S_n $ для всіх можливих вхідних масивів $ n $.
помилка

У штанах, я забув, що LaTeX підтримувався лише на TeX.SE та Math.SE. Просто уявіть собі ці символи в snooty italix.
помилка

18

Ось, бенкетуйте свої очі:

<?php
if (isset($_POST["doubleArray"]) === true) {
    $doubleValues = explode(":", $_POST["doubleArray"]);
    if (is_numeric($_POST["smallestDouble"]))
    {
        $sorted = $_POST["sorted"] . ":" . $doubleValues[$_POST["smallestDouble"]];
        unset($doubleValues[$_POST["smallestDouble"]]);
        $doubleValues = array_values($doubleValues);        
    }

    if (count($doubleValues) > 0) {
        $i = 0;
        foreach ($doubleValues as $value) {
            echo $i . " : " . $value . "<br />";
            $i++;
        }
        echo "Type the index of the smallest double value in the list: ";
    } else {
        echo "Sorted values" . $sorted;
    }
}else {
       echo "Enter double values separated by a colon (:)";

}
?>

<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
<?php
if (!isset($doubleValues)) {
    echo '<input type="text" name="doubleArray" /><br>';
} else {
    echo '<input type="hidden" name="doubleArray" value="' .
    implode(":", $doubleValues) .
    '" ><input type="text" name="smallestDouble" /><br>'.
    '<input type="hidden" name="sorted" value="' . $sorted . '" >';
}
?>
    <input type="submit" value="Submit">
</form>

Цей фрагмент коду відображає масив і просить користувача ввести найменший подвійний масив. Потім він додає число до списку відсортованих чисел, видаляє подвійний з масиву та відображає залишкові номери масивів.

* Помилкове тлумачення: Слабка точка, але ОП не точно очікує, що програма попросить користувача допомогти у сортуванні.

* Обман: користувач саме той, хто робить фактичне сортування.

* Продуктивність: Кожне число масиву вимагає зворотного кроку на сервері, і він вимагає від користувача знайти найменше число вручну. Продуктивність не може бути набагато гіршою.

* Неприйнятне: я думаю, що це я покрив. І удачі при повторному використанні. Найгірше - це найгірше, користувач може позбутися 90% коду та циклічно повторно, щоб знайти найменші значення та кожного разу видаляти їх, що дало б йому один із найменш ефективних алгоритмів сортування.

* Творчий і злий: ти мені скажи.


2
Ви говорите "бенкетуйте очі" і даєте мені PHP Oo
Aidiakapi

3
"Зло" було частиною вимог, чи не так?
Сільвердраг

17

Інтелектуальний дизайн сортування Javascript

function sort(array){
    console.log("Someone more intelligent than you has already sorted this optimally. Your puny brain cannot comprehend it");
    return array;//I do believe that this is the fastest sorting algorithm there is!
}

6
Кредит , де кредит повинен: dangermouse.net/esoteric/intelligentdesignsort.html
wchargin

1
Не розумієте, чому ви розбиваєте інтелектуальний дизайн на конкурсі програмування?
khebbie

12
@khebbie Чому б і ні?
Конрад Рудольф

Проблема полягає в тому, що якщо користувач є тим, хто вводить цифри, то вони будуть розумнішими за себе. ;)
d -_- b

16

Python - req. №1

Цей код буде сортувати подвійні елементи в лексикографічному порядку, а не збільшуючи числовий порядок, створюючи дерево префіксів цифр, а потім повторювати їх рекурсивно.

class trie_node:
    def __init__(self):    
        self.chn = {}
        self.instances = 0
        for char in "0123456789.-+e":
            self.chn[char] = None
    def insert_number(self, number):
        if(number == ""):
            self.instances += 1
        else:
            self.chn[number[0]] = trie_node()
            self.chn[number[0]].insert_number(number[1:])

def get_sorted_array(node, number):
    array_to_return = [number] * node.instances
    for char in "0123456789.-+e":
        if node.chn[char] != None:
            array_to_return += get_sorted_array(node.chn[char], number + char)
    return array_to_return

def pcg_sort(arr):
    root = trie_node()

    for element in arr:
        root.insert_number(str(element))

    sarr = get_sorted_array(root, "")
    fsarr = []
    for element in sarr:
        fsarr.append(float(element))

    return fsarr

input_array = []

while True:
    number = raw_input("Enter a double (/ to end): ")
    if(number == "/"):
        print pcg_sort(input_array)
        break
    else:
        try:
            number = float(number)
            input_array.append(number)
        except ValueError:
            pass

Це працює в n log nчасі, і насправді є розумним способом зберегти відсортований список інакше, але, на жаль, для ОП це робить зовсім не так.


4
Особливо сумнівним є також те, що якщо всі числа мають однакову кількість цифр перед десятковою точкою, вона насправді справно працює, тому ОП може навіть не помітити, що сорт робить щось не так, якщо він просто тестує його за допомогою вводу , скажімо, 2, 1, 3, 8, 5.
Джо З.

14

Сортує масив парних. На Java:

public String sort(double[] input){
String s = "";
for(Double d:input){
    s+=Long.toBinaryString(Double.doubleToRawLongBits(d));
}
char[] chars=s.toCharArray();
Arrays.sort(chars);
s="";
for(char c:chars){
    s+=c;
}
return s;}

Наприклад:

[0.0, 1.5, 123]

йде від несортованого бінарного зображення

011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000

до елегантно відсортованих

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111


11

Мені потрібна програма, де користувач вводить масив подвійних і програма виводить масив, відсортований. Скажіть, будь ласка, код?

Редагувати на @kealist, я думаю, що краще, якщо прокоментується, щоб поділ здався правдоподібним. У Реболі ...

doubled-list: load ask "Input list of doubles: "

;-- The list is of doubles, so we have to undouble them before sorting
;-- Use MAP-EACH to create a new list with each element divided by two
undoubled-list: map-each num doubled-list [num / 2] 

;-- Note: We could also have sorted before we undoubled the numbers
print sort undoubled-list

Відмовляючись від думки, що вони насправді не знають, що таке подвійний, і, можливо, вважають, що список парних пар - це лише купа чисел, помножених на два.


6
Можливо, їх потрібно вдвічі зменшити, оскільки вхід вже подвоївся!
кеаліст

@kealist Я вважав це, однак це грає на ідею, що відбувається "подвоєння". Я думаю, що він прокрадеться трохи краще, щоб мати [2 * число].
Доктор Ребму

10

Навмисне нерозуміння питання:

Використовуючи рекурсивний підхід:

def recsort(array):
    "Recursive sort"
    if array:
        for j, i in enumerate(array):
            for l1 in recsort(array[:j]):
                for l2 in recsort(array[j+1:]):
                    yield i + l1 + l2
                    yield i + l2 + l1
    else:
        yield ''

for p in recsort(raw_input("Array:")):
    print p

Гарантовано, що відсортований масив буде виписаний у якийсь момент для будь-якого типу даних у масиві, навіть будь-якого порядку сортування та навіть будь-якого типу роздільника для введення, що робить цей підхід надзвичайно гнучким. Основним його недоліком є ​​те, що для великих масивів це трохи повільно, але ви можете це легко вирішити за допомогою багатопотокової роботи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.