사용자가 복식 배열을 입력하고 배열을 정렬하여 출력하는 프로그램이 필요합니다.


280

참고 :이 질문은 여기에 처음 게시 한 이후 심각하게 편집되었습니다. 규칙이 여기 로 이동되었습니다 .이 목적을 이해하기 위해 답변을 게시하기 전에 읽으십시오. 이것은 범주 에서 만들어진 첫 번째 질문이었습니다 .

Stack Overflow에서 게으른 사용자가이 질문을한다고 상상해보십시오.

사용자가 이중 배열을 입력하고 배열을 정렬하여 출력하는 프로그램이 필요합니다. 코드를 알려주시겠습니까?

이 사용자를 트롤링하는 코드를 어떻게 만들 수 있습니까? 경험이없는 프로그래머에게는 유용하지만 실제로는 전혀 쓸모없는 코드를 만듭니다.

답변이 어떤 방식 으로든 자격이없는 경우를 제외하고, 승자가 가장 많이 찬성 된 답변입니다 (자격 요건에 대해서는 wiki의 태그 위키 설명 참조 ). 이전에 가장 많이 찬성 된 답변이 승인 된 후 많은 투표 수에서 미래에 이길 경우 새로운 최고 답변이 수락되고 이전 답변은 수락되지 않습니다. 동점 인 경우, 동점 인 사람 중에서 마음대로 승자를 선택하거나 조금 더 기다리겠습니다.

코드가없는 답변은 적합하지 않습니다. 그들은 재미 있고 공감대를 얻을 수는 있지만 받아 들여지지는 않을 것입니다.

규칙은 태그 설명 에서 찾을 수 있습니다 .

참고 : 이것은 질문입니다. 질문 및 / 또는 답변을 진지하게 받아들이지 마십시오. 자세한 내용은 여기를 참조 하십시오 .



6
@bluesm 누군가가 이미 자신의 학습 시간을 낭비하지 않고 다른 사람에게 문제 해결을 요청하기로 결정한 경우 스스로 학습 할 수있는 링크를 게시해도 아무 효과가 없습니다.
IQAndreas

3
와우,이 질문은 24 시간 이내에 100 개의 투표와 10,000 회의 조회수를 얻으려고합니다!
Joe Z.

18
맙소사, 빅터, 당신의 정보 상자가 너무 슬퍼요 ... 우리 모두 기복이 있지만 당신은 사람을 이길 수 없습니다. 당신은 지금 어디에서나 코드 골퍼의 영웅입니다!
SimonT

4
아직 아무도 수면을 기반으로 한 솔루션을 제공하지 않은 것에 놀랐습니다.
Frank Farmer

답변:


178

때때로 이곳의 커뮤니티는 숙제를 돕고 싶지 않습니다. 그래서 많은 농담 답변을 받고 있습니다. 그러나 나는 도와주고 싶다. 다음은 'C'의 완전한 솔루션입니다 (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 연산자-매우 고급 C 프로그래밍 기술.
Kaya

5
를 사용해야합니다 sscanf(input, "%5s", &input[0]). 그렇지 않으면 입력을 구문 분석하는 동안 오버런 버그가 발생할 수 있습니다. 그리고 char input[sizeof(int)+1]64- 비트 시스템과의 호환성을 위해 input을 선언해야 합니다.
sh1

12
i==1?"st":"th"hahaha ...
Guy Sirton

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 코더가 스펙에 맞는 솔루션을 고려할 수있는 집에 너무 가깝습니다!
Dr. Rebmu

10
매우 많은 수의 개체를 정렬해야하는 경우도 고려하십시오. 데이터베이스에서 "프로그램 외부"로 정렬하는 것이 실현 가능한 솔루션입니다.
Viktor Seifert

40
여기에 추상화가 충분하지 않습니다. 최소한 10 개의 인터페이스, 20 개의 구현, 열거, 단위 테스트, 적용 범위 테스트, Maven, 통합 테스트, 모의가 필요합니다.
Naftuli Kay

6
@NaftuliTzviKay 아이디어를 구현하기 위해 MySQLSortEnterpriseEdition을 만들어야합니다. Victor는 여기서 코드를 GPL 라이센스에 동의하여 시작할 수 있습니까?
Joe Z.

14
@JoeZ. 예, 라이센스 모델에 대한 의견이 부족하여 프로그램 시작시 사용자가 EULA를 수락하도록해야합니다. 그러나 게으른 OP에 제공하기 때문에 오랫동안 기다려온 프리미엄 MySQLSortEnterpriseEdidtion을 만드는 데 유용하며 비상업적 용도로는 무료입니다.
Victor Stafusa

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, writerprocessor사용

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 나는 개별적으로 +1 할 수 있도록 3 인 이상 '모듈'답변으로 답변을 깰 제안
greggo을

15
그리고 맨 위에 체리는 실제로 라이브러리 정렬을 사용하고 있다는 것입니다.) 사양에 따라 완전히 쓸모가 없습니다
SWeko

9
그건 ... 아름다웠어요
Andrew

7
DI를 사용하면 OP가 혼란 스러울 수 있습니다. 이는 간단한 예일뿐입니다.
SWeko

132

더 문자 그대로 해석 :

echo " aaehrrty"

즉, "배열"이 정렬되었습니다.


5
나는 이것을 게시하기 위해 여기에 왔습니다.
Quuxplusone

5
파일로 저장 sort.sh하고 전화sh sort.sh "an array of doubles"
Kyss 타오

"사용자가 복식 배열을 입력했습니다"를 놓친 것 같습니다.
Dukeling

1
@Dukeling 그것이 Kyss Tao의 논평의 요점입니다. "an array of doubles"명령 행 인수로 스크립트에 전달 될 수 있습니다.
AJMansfield

108

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 스크립트만큼이나 해독
코리 골드버그

6
@swelljoe 사실, $_그 시점에서 빈 문자열입니다. 원하는 출력을에 저장했습니다 $\ . 출력 레코드 구분 기호입니다.
PhiNotPi

4
@ 앤디 간단합니다. "어떻게 작동합니까?"
John Dvorak

1
모든 사용자가 만든 변수는 모든 사유 규칙을 따라야 꽤 이름이
하겐 폰 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 

알고리즘은 목록이 정렬되지 않은 경우 각 요소를 추가하여 목록을 통과합니다. 따라서 출력은 정렬 된 목록이며 원래 목록의 모든 요소를 ​​포함하는 목록이 아닙니다. op가 목록이 정렬 된 순서인지 확인하면 출력값이 누락되었음을 알 수 없습니다.


1
직접 게시하기 전에 다른 답변을 참조하십시오. 언어 이름을 추가해야합니다. 이 질문에 대답하려면 OP를 트롤하기 위해 무엇을하고 있는지 간단히 설명해야합니다.
Wasi

5
Hehe, 이것은 실제로 나를 크게 웃게했다. 어쨌든, 나는 조금 더 나은 설명이 도움이 될 것이라는 데 동의합니다.
oconnor0

2
sys.stdin.read()오타 또는 실제 트롤링 답변의 일부에 대한 이중 통화 입니까? 확실히 배열을 입력으로 제공하고 결과를 기다리는 OP를 좌절시킬 것입니다 ...
Bakuriu

와, 그건 악한 일이야
Sylverdrag

13
O(n)정렬 알고리즘. 좋은.
ejrb

65

배쉬, 54 자

C 및 Python과 같은 비효율적 인 느린 언어를 사용하는 많은 답변 ... 모든 스크립팅 언어의 어머니 인 Bash에 솔루션을 제공하여 작업 속도를 조금 높여 드리겠습니다.

나는 당신이 생각하는 것을 알고 있습니다-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 내장 명령을 사용하고 있으며, 외부의 바이너리를 (당신이 순수하게 옵션 자세한 출력을 계산하지 않는 경우 즉,)를 호출하지. bogosort와 달리 런타임은 결정적입니다.

팁 : 효과적인 최적화는 입력 번호를 정렬하기 전에 계수로 나누는 것입니다. 구현은 독자에게 맡겨져 있습니다.

편집하다:

덜 예쁘게 인쇄 된 54 문자 골프 버전 단축 :

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

11
트롤링 1 : 알고리즘은 작동하지만 잠재적으로 매우 느립니다. 각 숫자마다 스레드를 생성하여 숫자를 출력하기 전에 해당 시간 (초) 동안 휴면 상태입니다 (순서대로). 트롤링 2 : 또한, 대부분의 코드는 얼마나 많은 스레드가 생성되는지에 대한 좋은 설명을 작성하는 데 사용되며, 추가 정보를 얻기 위해 시스템의 CPU 정보를 불필요하고 점진적으로 읽고 구문 분석합니다. 트롤링 3 : 마지막에 "정렬 된 배열"을 출력합니다. 트롤링 4 : 사용자는 ctrl-c를 눌러 "정렬"을 취소 할 수 없습니다.
Riot

4
5. 사용으로 인해 GNU / Linux 에서만 작동합니다 /proc/cpuinfo.
kps11346

5
정말 창의적인 솔루션, :)
dmitry

8
이것은 놀랍다. 나는 그것이 얼마나 멋진지를 표현할 수조차 없습니다. 왜 그런지 않기 때문에 적극적으로 사용하는 것을 고려하고 있습니다.

4
나는 실제로 어딘가에 프로덕션 환경에서 사용되는 변형을 가지고 있습니다. 그러나 그 상황에서 프로세스의 실행 시간이 중요하므로 이것이 바로 변명입니다.
Riot

64

JavaScript에는 내장 sort()함수가 있으며 다음과 같이 사용할 수 있습니다.

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

... 오, 완전히, 언급하는 것을 잊었다는 사전 식 순서, 즉에 정렬 10 < 9하고 9 < -100. 아마 그것은 당신이 어쨌든 기대하는 것입니다.


8
내장 기능이기 때문에 더 좋습니다.
Wayne Werner

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 객체 $,를 사용하여 배열 awindow.promptas의 결과를 포함 해야 p합니다.
Qantas 94 Heavy

2
"까다로운 부분"은 우아합니다. OP, 언젠가 그런 종류의 코드 구조를 갖기 위해 노력하십시오.
Chris Barker

2
F'n doble "유효성 검사"LOOOOOOOOOOOOL omg omg day 만든! 더 적은 캡을 위해 수정 됨
HC_

54

이 솔루션은 C에서 제공하는 간결함과 OS 수준 액세스를 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여분의 악 을 위해 사용하지 않습니다 . 또한 후행 후 정규 표현식을 사용하면 OP를 더 혼란스럽게하기 위해 얀 드보락 (Jan Dvorak 덕분에)조차 할 수조차 없었습니다!


4
아이디어를 확장하면서 사용자가 문자열을 입력 할 때까지 반복적으로 입력을 요청합니다 an array of doubles.
Wrzlprmft

@Wrz 좋아, :-) 수행
문 손잡이

2
OP가 좋지 않으면 개행을 제거하는 방법을 알아 내야하기 때문에 ( gets대신에 대신 사용하기 때문에 gets.chomp) 매우 좋습니다.
wchargin

@WChargin Yep, 나는 첫 번째 개정판에서 그것을 가지고 있었지만 (개정 기록 참조) 더 악한 것으로 제거했습니다. 나는 이것을 편집 할 것이다 :-)
Doorknob

1
+1 나는 단지 여기에 계정을 만들었습니다. 이것이 바로 내가 대답하는 방법입니다! 그것을 사랑하십시오!
DGM

44

파이썬 3.3

물론 stdin에 목록 리터럴로 주어진 배열을 정렬 할 수 있는 가장 간단한 Python 프로그램이 있습니다.

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)

불행히도 yield from표현식을 사용하기 때문에 python3.3 +에서만 작동합니다 . 코드는 설명이 필요하므로 교수에게 전달할 때 아무런 문제가 없어야합니다.


트롤링은 OP가 의도 한 바를 정확하게 수행하는 다음과 같은 방식으로 완벽하게 작동하는 솔루션을 제공합니다 .

  • 이해할 수 없음 (초보자)
  • 다음과 같은 이유로 교사를 다루기가 불가능합니다.
    • OP가 이해할 수 없다
    • 선생님이 그것을 이해하기 위해 해독 할 시간이 없었을지라도
  • 프로그래밍이 그에게 너무 어렵다고 생각할 수도있는 순진한 초보자에게는 무섭다

요약하면이 답변은 특정 관점에서 완벽하게 유효한 답변으로 요청을 조롱하는 학생의 좌절감을 크게 증가시킵니다.


(위의 코드를 이해하는 데 어려움이 있다고 생각되면 읽지 마십시오)

정렬 알고리즘이 실제로 구현되어 있다는 사실로 인해 트롤링이 증가한다고 덧붙여 야합니다.

버블 정렬! ... OP조차도 이해할 수있는 방식으로 구현 될 수 있습니다. 그것은 그 자체로 모호한 알고리즘이 아니며 OP가 그렇지 않으면 완벽하게 이해할 수있는 코드를 난독 화하는 것입니다.


3
나는 이것이 더 많은 설명을 사용할 수 있다고 생각한다. 지금 인페르노 에게 무엇 을하고 있습니까?
KRyan

1
와우, 비 ASCII 변수 이름을 파이썬으로 할 수 있습니까? 몰랐다
kratenko

1
python3 +에서 @kratenko. python2에서 인터프리터는 ASCII를 인코딩으로 가정하고 오류를 발생시킵니다. python3에서 인터프리터는 UTF-8을 인코딩으로 가정하고 식별자의 유니 코드 속성으로 "문자"인 모든 문자를 허용합니다.
Bakuriu

3
@ KRyan : 그는 분명히 Hell이 사람들을 9 개의 서클에 넣는 데 사용하는 정렬 방법을 사용하고 있습니다.
Joe Z.

10
오 세상에… +1.
Sean Allred

41

C-느리고 사용하기 어렵고 받아 들일 수없는 코딩 스타일

정렬 알고리즘 자체는 slowsort라고하며, 약 n ^ (log n / 2)의 대소 문자 복잡도 (단순도)를 갖습니다 . 이 알고리즘은 Andrei Broder와 Jorge Stolfi에 의해 훌륭한 논문 "Pessimal Algorithms and Simplexity Analysis" 에서 출판되었습니다 .

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 바이트보다 큰 모든 입력에 대해 정의되지 않은 동작이 있습니다. 받아 들일만한 대답이 아닙니다.
Michael Spencer

1
"Pessimal Algorithms"논문을 좋아하십시오. 감사.
Ryan

“내가 아는 가장 느린 결정 론적 정렬 알고리즘”– 아마도 가장 느린 결정 론적 정렬 알고리즘. 그게 논문의 요점 인 AFAIR입니다.
Konrad Rudolph

@MichaelSpencer 관리가 정교합니까? 나는 입력 크기가 24 바이트 인 예제를 제공했으며 출력은 예상 한 것입니다 (여기서 농담이 누락 된 것 같습니다).
shiona

2
@Sasho이지만 bogo-sort는 \ Omega (n)의 최상의 실행 시간을 갖습니다 (n-1 비교, 0 작업). 일명 훨씬 빠릅니다. \ Omega (n ^ (log n / 2))보다 나쁩니다.
shiona

39

루비, 악한보고 르 소트! (보너스 : 사용자 입력에 의한 bogosort)

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두 번째 줄에 추가하여 쉽게 수정할 수 있지만 OP는 알 수 없습니다.
  • 사용하지 않는 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 * ","

bogobogosort 하지 않습니까 ? (기이 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

OP는 결코 그들을 정렬하는 방법을 말하지 않았다. 데이터 유형을 가정 double하지만 중복 된 것으로 해석합니다 . 여기 JavaScript를 사용하십시오.

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
"데이터 유형을 double로 가정하지만 중복으로 해석합니다." 진정한 천재 만이 그렇게 생각할 것입니다. 그냥 화려한!
Felipe Miosso

@FelipeMiosso 솔직히 말해서, 당신이 단지 냉소적 인 것인지 확실하지 않습니다 ...
Kiruse

1
하하 ... 나는 냉소적이었다. 그런 식으로 생각하는 사람들이 있다는 것을 알고 있습니다. 어쨌든 ... 당신의 대답은 서사시였습니다! 많이 웃었습니다.
Felipe Miosso

@FelipeMiosso 다행이 웃을 수 있도록 도와 드리겠습니다. ;)
Kiruse

console.log 모든 것!
Emil Vikström

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 사양을 읽어보십시오 . 여기서 구입할 수 있습니다 . totalOrder 술어의 §5.10 세부 사항에 대한 각주 에서 다음과 같이 언급됩니다.

totalOrder는 모든 인코딩에 대해 총 정렬을 형식으로 적용하지 않습니다. 특히, 하나 또는 두 개의 인코딩이 비정규적인 경우와 같이 동일한 부동 소수점 표현의 다른 인코딩을 구별하지 않습니다.

따라서 우리는 double을 정렬하는 코드를 작성하는 것이 불가능하다는 것을 알았습니다. 속임수입니다. 하하하 매우 영리하다! 교수님의 과정을 매우 즐기고 있습니다.

[편집 : 문제가 총 주문을 요구한다고 가정 하지 않아도 됩니다]


3
그러나 문제는 복식을 정렬하는 것이 었습니다. 아무도 값을 (총) 순서로 요구하지 않았습니다. 예를 들어, 배열을 양수와 음수의 두 개로 정렬 할 수 있습니다. 당신은 그 질문에 배신당했습니다.
shiona

23

사악한 자바 스크립트 :

OP, 모든 것을 제공하고 싶지 않으므로 사용자로부터 직접 입력하는 방법을 알아 보겠습니다 (힌트 : use 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]과 함께 작동하는 바이올린입니다.


참고 : 당면한 문제로 인해 성능이 저하되고 복잡하며 확장 할 수없는 것 외에도 OP가 부동 소수점 수학에 대해 알지 못하는 경우 특히 실망 할 것입니다. 예를 들어, 사용자 입력이 [8.1, 5, -.8, 2.3, 5.6, 17.9]있고 OP가 간단한 값 (예 : minimumVal=-.8increment=.1)을 선택하면 프로그램이 영원히 실행됩니다. 관련 메모에서 나는 현재이 문제로 인해 작동하지 않는 2 개의 브라우저 탭을 자랑스럽게 생각합니다. :)

참고 II : 위 코드를 작성해도 역겨운 느낌이 들었습니다.

참고 III : MWA HAHAHAHA!


좋은 생각. 당신은 여전히 ​​프로그래밍 초보자 일 때 시원했을 것입니다.
Pierre Arlaud

22

Java에 대해 좋아 하는 실제 답변은 다음과 같습니다 .

println 전에 라인을 추가하면 배열이 정렬됩니다

Arrays.sort( array );

설명 없지만 OP를 혼란스럽게 하지만 더 많은 숙련 된 프로그래머로부터 효과를 얻습니다.


또 다른 비슷한 대답 :

Arrays.sort () 살펴보기

OP에게 자신의 연구를하도록 간접적으로 지시하면서도 모호한 정답을 제공합니다. 추가 연구 없이도 OP는 여전히 혼란스러워 합니다. 또한 링크가 이전 문서를 가리키는 것이 좋습니다.


10
이것은 유용하고 따라서 투표에 합당합니다.
emory

11
"간접적으로 그에게 막연한 정답을주고있는 동안 자신의 연구를 수행 할 OP를 말하고"거의 StackOverflow의 응답의 내 스타일을 설명합니다 : /
코리 골드버그

7
"Arrays.sort ()를 살펴보십시오."... "프로그램에서 사용하는 방법에 대한 예제를 얻을 수 있습니까?" ... 훌륭한.
SimonT

5
특히 우리의 겸손한 OP는 클래스에 대한 정렬을 작성해야하므로 Array.sort ()를 완전히 쓸모 없게 만듭니다.
Kevin

2
Ctrl + F-> "프로그램에서 사용하는 방법에 대한 예제를 얻을 수 있습니까?" = 3 개의 결과.
Qix

21

JAVA의 정렬 문제에 대한 유전자 알고리즘 / Monte Carlo 방법

정렬 문제는 오랫동안 컴퓨팅 과학에 알려져 있으며 많은 훌륭한 솔루션이 발견되었습니다. 최근 몇 년 동안 생물 계산이 크게 발전했으며 생물학이 문제를 해결하는 방법을 살펴보면 어려운 문제를 해결하는 데 큰 도움이되는 것으로 나타났습니다. 이 정렬 알고리즘은 이러한 아이디어를 최대한 활용하여 정렬 문제를 해결하는 데 사용합니다. 아이디어는 매우 간단합니다. 정렬되지 않은 배열로 시작하여 이것이 어떻게 정렬되어 있는지 확인하십시오. 당신은 그것의 "정렬"의 점수를주고 당신이 부모에 대한 모든 것을 알고 있더라도 아이들이 어떻게 보일지 확실하지 않은 생물학에서와 같이 임의의 구성 요소로 배열을 퍼밋합니다! 이것이 유전자 알고리즘 부분입니다. 말하자면 그 배열의 자손을 만듭니다. 그런 다음 자손이 부모보다 더 잘 분류되어 있는지 확인합니다 (일명 적자 생존). 이 경우 배열이 완전히 정렬 될 때까지 다음 순열을 작성하기위한 시작점으로이 새 배열을 계속 사용하십시오. 이 접근법의 멋진 점은 배열이 이미 시작부터 약간 정렬되어 있으면 더 짧아진다는 것입니다!

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 또는 Monte Carlo를 다른 수준의 트롤이라고 부릅니까? 나는 이것이 무작위 언덕 등반 알고리즘이라고 생각합니다.
shiona

이 프로그램을 유행어 이름과 연관시키는 것은 의도적 인 것이었지만 "무작위 화 된 언덕 등반 알고리즘"에 대해 들어 본 적이 없습니다. 더 넓은 의미에서 GA와 Monte Carlo가 너무 잘못되어 명백하게 잘못되었다고 생각하지 않습니다 ...
luksch

19

파이썬

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

배열 (목록)을 소수점 세 번째 와 다섯 번째 소수점 의 합으로 정렬합니다 .


5
불행히도,이 후 모든 것을 제거 lambda x:하고로 대체 하여 사소하게 수정됩니다 x. 그래도 초보자 코더는 그 사실을 결코 알지 못할 것입니다.
Joe Z.

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
당신의“알고리즘”은 눈물을 흘 렸습니다.
Nate

D :이> 완료 부여되지 않기 때문에 하 석, 그 알고리즘 아니다
jmacedo

@joxnas, 실제로 비 결정적 랜덤 디바이스를 사용할 수없는 시스템에서는 랜덤 라이저가 실제로 주기적 일 수 있습니다. 그런 다음 랜덤 화기가 허용하는 가능한 순열 세트가 모든 가능한 입력 배열 길이 $ n $에 대해 가능한 순열 세트 $ S_n $를 포함하는지 여부에 따라 달라집니다.
bug

바지는 LaTeX가 TeX.SE와 Math.SE에서만 지원되는 것을 잊었습니다. 스 누티 italix로 그 기호를 상상해보십시오.
bug

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>

이 코드는 배열을 표시하고 사용자에게 배열의 가장 작은 두 배를 입력하도록 요청합니다. 그런 다음 정렬 된 숫자 목록에 숫자를 추가하고 배열에서 이중을 제거하고 나머지 배열 번호를 표시합니다.

오해 : 잘못된 점이지만 OP는 프로그램이 사용자에게 정렬을 도와달라고 정확하게 요구하지 않습니다.

* 부정 행위 : 사용자는 실제 정렬을 수행하는 사람입니다.

* 성능 : 모든 배열에는 서버 왕복이 필요하며 사용자는 가장 작은 숫자를 수동으로 찾아야합니다. 성능은 훨씬 나빠질 수 없습니다.

* 허용되지 않음 : 내가 덮여 있다는 거 같아요. 재사용에 행운을 빕니다. 최악의 경우, 사용자는 코드의 90 %를 제거하고 반복적으로 반복하여 가장 작은 값을 찾아 매번 제거하여 가장 효율적인 정렬 알고리즘 중 하나를 제공 할 수 있습니다.

* 창의적이고 악한 : 당신이 말해.


2
당신은 PHP과 OO '을 눈 잔치'와 줘라고
Aidiakapi

3
"악"이 요구 사항의 일부였습니까?
Sylverdrag

17

자바 스크립트 지능형 디자인 정렬

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!
}


1
프로그래밍 공모전에서 왜 지능형 디자인을 강타하는지 이해하지 못하셨습니까?
khebbie

12
@khebbie 왜 안돼?
Konrad Rudolph

문제는 사용자가 숫자를 입력하는 사람이라면 자신보다 지능적입니다. ;)
d -_- b

16

파이썬 – 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시간에 작동하며 실제로 정렬 된 목록을 유지하는 현명한 방법입니다. 그러나 불행히도 OP의 경우 완전히 잘못되었습니다.


4
모든 숫자가 소수점 앞에 동일한 자릿수를 가지면 실제로 제대로 작동하므로 OP는 입력을 사용하여 테스트하면 정렬이 잘못되고 있음을 알지 못할 수도 있습니다. ,,라고 2, 1, 3, 8, 5.
Joe Z.

14

복식 배열을 정렬합니다. 자바에서 :

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에 따라 편집하면 분할을 그럴듯하게 보이게하는 것이 좋습니다. 에서 REBOL ...

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

실제로 복식이 무엇인지 모르고 복식 목록에 2를 곱한 숫자라고 생각할 수도 있습니다.


6
입력이 이미 두 배이기 때문에 반으로 줄여야 할 수도 있습니다!
kealist

@ kealist 나는 이것이 "더블링"이 일어나고 있다는 생각에 근거한다고 생각했다. [2 * num]을 갖는 것이 조금 더 잘 몰린다 고 생각합니다.
Dr. Rebmu

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

정렬 된 배열은 배열의 모든 유형의 데이터, 모든 정렬 순서 및 입력에 대한 모든 구분 기호에 대해 어느 시점에서 출력되도록 보장되므로 이러한 접근 방식이 매우 유연합니다. 주요 단점은 대형 배열의 경우 약간 느리지 만 멀티 스레딩으로 쉽게 해결할 수 있다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.