Tôi cần một chương trình trong đó người dùng nhập một mảng nhân đôi và chương trình xuất ra mảng được sắp xếp


280

Lưu ý: Câu hỏi này đã được chỉnh sửa nghiêm ngặt kể từ lần đầu tiên tôi đăng nó ở đây. Các quy tắc đã được chuyển đến đây , đọc chúng trước khi đăng bất kỳ câu trả lời để hiểu mục đích của việc này. Đây là câu hỏi đầu tiên được tạo ra trong danh mục .

Hãy tưởng tượng một người dùng lười biếng trên Stack Overflow hỏi câu hỏi này:

Tôi cần một chương trình trong đó người dùng nhập một mảng tăng gấp đôi và chương trình xuất ra mảng được sắp xếp. Bạn có thể vui lòng cho mã?

Làm thế nào bạn có thể tạo một đoạn mã sẽ troll người dùng này? Tạo một đoạn mã sẽ xuất hiện hữu ích cho một lập trình viên thiếu kinh nghiệm nhưng hoàn toàn vô dụng trong thực tế.

Người chiến thắng là câu trả lời được đánh giá cao nhất, ngoại trừ nếu câu trả lời bằng cách nào đó không đủ điều kiện (đối với các yêu cầu đủ điều kiện, hãy kiểm tra mô tả wiki về ). Nếu câu trả lời được đánh giá cao nhất trước đó bị đánh bại trong tương lai về số lượng upvote sau khi được chấp nhận, câu trả lời tốt nhất mới được chấp nhận và câu trả lời trước đó không được chấp nhận. Trong trường hợp hòa, tôi sẽ chọn người chiến thắng theo ý muốn trong số những người bị trói hoặc chỉ chờ thêm một chút.

Câu trả lời không có mã không đủ điều kiện. Họ có thể vui vẻ và nhận được một số upvote, nhưng họ sẽ không được chấp nhận.

Các quy tắc có thể được tìm thấy tại mô tả thẻ .

Lưu ý: Đây là một câu hỏi . Xin đừng coi trọng câu hỏi và / hoặc câu trả lời. Thêm thông tin ở đây .



6
@bluesm Nếu ai đó đã quyết định nhờ người khác giải quyết vấn đề của họ thay vì "lãng phí" thời gian học tập của họ, việc đăng một liên kết đến nơi họ có thể tự học sẽ không có ích gì.
IQAndreas 27/12/13

3
Ồ, câu hỏi này sắp nhận được 100 lượt upvote và 10.000 lượt xem sau chưa đầy 24 giờ!
Joe Z.

18
Chúa ơi, Victor, hộp Giới thiệu của bạn rất buồn ... tất cả chúng ta đều có những thăng trầm nhưng bạn không nên tự đánh mình. Bây giờ bạn là một anh hùng cho Code Golfers ở mọi nơi!
SimonT

4
Tôi ngạc nhiên không ai có thể cung cấp một giải pháp dựa trên giấc ngủ loại chưa
Frank Farmer

Câu trả lời:


178

Đôi khi cộng đồng ở đây không muốn giúp làm bài tập về nhà. Đó là lý do tại sao bạn nhận được rất nhiều câu trả lời đùa. Nhưng tôi thích giúp. Đây là một giải pháp hoàn chỉnh trong 'C' (vì tôi cho rằng bạn muốn học "lập trình", chứ không phải "viết kịch bản" bằng Java hoặc Ruby). Tôi đã bao gồm nhiều lời khuyên mà tôi ước mình đã biết khi mới học

#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
hầu như tất cả các lời khuyên đều sai, và nó chỉ đơn giản là yêu cầu danh sách đầu vào cho đến khi bạn nhập nó đã được sắp xếp.
AShelly 27/12/13

47
+1, cho 1st, 2th, 3th, 4th...và toán tử dowo - các kỹ thuật lập trình C rất tiên tiến.
Kaya

5
Nên sử dụng sscanf(input, "%5s", &input[0]), nếu không có thể có lỗi tràn ngập trong khi phân tích cú pháp đầu vào. Và đầu vào phải được khai báo char input[sizeof(int)+1], để tương thích ngược với các hệ thống 64 bit.
sh1

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

15
Java có bộ sưu tập rác. Do đó, Java là dành cho "kịch bản", không phải lập trình thực. Đó là CS101 cơ bản. (vì vậy nói là troll.)
AShelly 28/12/13

181

Đây là java. Nó hoàn toàn gian lận, không thể chấp nhận và không thể trộn được vì nó tạo ra một cơ sở dữ liệu MySQL, chèn số ở đó, thực hiện chọn với mệnh đề ORDER BY và xuất ra các số do MySQL đưa ra. Trong thực tế, chính MySQL là người sắp xếp chứ không phải chương trình.

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
Điều đó thực sự hơi gần nhà đối với những gì mà nhiều lập trình viên Java sẽ coi là một giải pháp phù hợp có thể chấp nhận được với thông số kỹ thuật !!
Bác sĩ Rebmu

10
Cũng xem xét trường hợp bạn cần sắp xếp một số lượng rất lớn các đối tượng. Sắp xếp chúng "bên ngoài chương trình" trong cơ sở dữ liệu là một giải pháp khả thi.
Viktor Seifert

40
Không đủ trừu tượng ở đây. Bạn cần ít nhất 10 giao diện, 20 triển khai, enum, kiểm tra đơn vị, kiểm tra phạm vi, Maven, kiểm tra tích hợp, giả lập ...
Naftuli Kay 27/12/13

6
@NaftuliTzviKay Chúng ta nên tạo một MySQLSort EntrypriseEdition để thực hiện ý tưởng của bạn. Victor có đồng ý cấp giấy phép GPL ở đây để chúng tôi có thể bắt đầu không?
Joe Z.

14
@JoeZ. Có, câu trả lời của tôi là thiếu ý kiến ​​về mô hình cấp phép và tôi nên khiến người dùng chấp nhận EULA khi bắt đầu chương trình. Nhưng vì tôi đang đưa nó cho OP lười biếng, nó miễn phí cho sử dụng phi thương mại, bao gồm cả việc hữu ích để tạo ra MySQLSort EntrypriseEdidtion cao cấp được chờ đợi từ lâu.
Victor Stafusa

142

C # - Không có giết như quá mức cần thiết

Trước hết, GiMmEtHaCoDeZ thân mến, chúng ta hãy cố gắng phá vỡ nhiệm vụ của bạn:

  1. Đọc số
  2. Sắp xếp chúng
  3. Xuất các số được sắp xếp.

Vì "Phân chia và chinh phục" là chiến lược rất quan trọng khi làm việc với các vấn đề phần mềm, hãy giải quyết từng vấn đề một

1. Đọc

Một vấn đề quan trọng khác trong phần mềm là tính linh hoạt. Vì nó không được chỉ định cách người dùng sẽ nhập số, điều đó có thể xảy ra thông qua bảng điều khiển, qua tệp, qua dịch vụ web, v.v. Thậm chí có thể là một số phương pháp mà chúng ta không thể nghĩ ra vào lúc này. Vì vậy, điều quan trọng là giải pháp của chúng tôi sẽ có thể đáp ứng các loại đầu vào khác nhau. Cách dễ nhất để đạt được điều đó sẽ là trích xuất phần quan trọng vào giao diện, giả sử

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

  DoubleArrayReaderType Type {get;}
}

nơi DoubleArrayReaderTypeđược một điều tra đưa ra với

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

Điều quan trọng nữa là làm cho phần mềm có thể kiểm tra được từ đầu, vì vậy việc triển khai giao diện sẽ là

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

Tiếp theo, câu hỏi logic là làm thế nào chúng ta sẽ biết để tải phần thích hợp IDoubleArrayReadervào mã. Điều đó thật dễ dàng miễn là chúng ta sử dụng một nhà máy đơn giản:

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];
  }
}

Lưu ý rằng, chúng tôi sử dụng sự phản chiếu để tải tất cả các trình đọc đang hoạt động, do đó, mọi tiện ích mở rộng trong tương lai sẽ tự động có sẵn Bây giờ, trong phần chính của mã ngoài chúng tôi chỉ cần làm:

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

2. Xử lý (sắp xếp)

Bây giờ chúng ta cần xử lý, tức là sắp xếp các số chúng ta có được. Lưu ý rằng các bước hoàn toàn độc lập với nhau, do đó, đối với hệ thống con sắp xếp, việc nhập số như thế nào không quan trọng. Ngoài ra, hành vi sắp xếp cũng là một thứ có thể thay đổi, ví dụ chúng ta có thể cần phải nhập một thuật toán sắp xếp hiệu quả hơn. Vì vậy, một cách tự nhiên, chúng tôi sẽ trích xuất hành vi xử lý được yêu cầu trong một giao diện:

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

  DoubleArrayProcessorType Type {get;}
}

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

Và hành vi sắp xếp sẽ chỉ thực hiện giao diện:

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

Tất nhiên, chúng ta sẽ cần một nhà máy để tải và quản lý các trường hợp xử lý.

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. Viết đầu ra

Không có gì nhiều để nói ở đây, vì đây là một quá trình phản ánh đầu vào. Trên thực tế, chúng ta có thể kết hợp các nhà máy đọc và viết thành một DoubleArrayInputOutputFactory, như thế này:

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];
  }

}

Để tất cả chúng cùng nhau

Cuối cùng, chương trình chính của chúng tôi sẽ sử dụng tất cả những điều tuyệt vời này mà chúng tôi đã xây dựng, vì vậy mã sẽ chỉ là:

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

ở đâu, ví dụ như chúng ta có thể xác định reader, writerprocessorsử dụng

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 cho quá mức điên cuồng. Tôi khuyên bạn nên chia câu trả lời của mình thành 3 hoặc nhiều câu trả lời 'mô-đun' để tôi có thể +1 chúng riêng lẻ
greggo

15
Và anh đào trên đỉnh là nó thực sự sử dụng một loại thư viện :) Nó hoàn toàn là thông số kỹ thuật, và hoàn toàn vô dụng
SWeko

9
Điều đó ... thật ... đẹp.
Andrew

7
Sử dụng DI sẽ chỉ gây nhầm lẫn cho OP, vì đây chỉ là một ví dụ nhanh.
SWeko

132

Thậm chí nhiều nghĩa đen hơn:

echo " aaehrrty"

đó là "mảng" được sắp xếp.


5
Tôi đến đây để đăng bài này.
Quuxplusone

5
lưu dưới dạng tệp sort.shvà gọi dưới dạngsh sort.sh "an array of doubles"
Kyss Tao

Tôi nghĩ rằng bạn đã bỏ lỡ "người dùng nhập một mảng gấp đôi".
Dukeling

1
@Dukeling đó là điểm nhận xét của Kyss Tao. "an array of doubles"có thể được truyền cho tập lệnh dưới dạng đối số dòng lệnh.
AJMansfield

108

Perl

Trong tất cả những điều tôi đã làm cho CodeGolf.SE, việc này có lẽ mất nhiều thời gian nhất, ít nhất là vài giờ.

$_[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;

Đầu vào là của hình thức [2,4,5,7,7,3]và đầu ra là của hình thức [2,3,4,5,7,7].

Tôi không có thời gian để giải thích bây giờ ... hãy quay lại sau.

Dù sao, có một cái gì đó gọi là một mảng ẩn danh trong Perl. Nó là một mảng, nhưng nó không có tên. Tuy nhiên, những gì chúng ta biết là một tham chiếu (vị trí bộ nhớ) trỏ đến nó. Một dãy số trong ngoặc vuông tạo ra một mảng ẩn danh và nó trả về một tham chiếu đến nó.

Câu trả lời này được xây dựng từ một loạt các mảng ẩn danh, các tham chiếu được lưu trữ trong đó @_. Đầu vào được biến thành một mảng ẩn danh. Sau đó chúng tôi tạo các mảng ẩn danh khác, mỗi phần tử trong đó là tham chiếu đến một phần tử trong mảng trước đó. Thay vì sắp xếp các phần tử trong mảng, chúng tôi sắp xếp các con trỏ tới các phần tử trong mảng đó. Ngoài ra, chúng tôi tạo một mảng mới cho mỗi bước (và hơn thế nữa) trong hoạt động sắp xếp.


3
Quỷ dữ! Quỷ dữ! Quỷ dữ!
DGM

56
về giải mã như bất kỳ tập lệnh Perl nào khác với tôi :)
Corey Goldberg

6
@swelljoe Thật ra, $_là một chuỗi rỗng vào thời điểm đó. Tôi lưu trữ đầu ra mong muốn của tôi $\ , đó là phân tách bản ghi đầu ra.
PhiNotPi

4
@Andy đơn giản. "Làm thế nào nó hoạt động?"
John Dvorak

1
và tất cả các biến do người dùng tạo có các tên đẹp tuân theo tất cả các quy ước đáng suy nghĩ
Hagen von Eitzen

80

Con trăn

Cung cấp cho người dùng một mảng được sắp xếp bằng cách loại bỏ tất cả các phần tử không theo thứ tự được sắp xếp khỏi mảng đầu vào.

import sys

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

Thuật toán đi qua danh sách chỉ thêm từng phần tử nếu nó không làm cho danh sách không được sắp xếp. Do đó, đầu ra là một danh sách được sắp xếp, không phải là một danh sách chứa tất cả các thành phần của danh sách gốc. Nếu op chỉ kiểm tra xem danh sách có theo thứ tự được sắp xếp không, anh ta có thể không nhận thấy rằng đầu ra bị thiếu giá trị.


1
Xin vui lòng xem câu trả lời khác trước khi đăng bài của riêng bạn. Bạn nên thêm tên ngôn ngữ của bạn. Để trả lời câu hỏi này, bạn cũng cần giải thích ngắn gọn những gì bạn đang làm để troll OP.
Wasi

5
Hehe, cái này thực sự làm tôi cười thành tiếng. Dù sao, tôi đồng ý rằng một lời giải thích tốt hơn một chút sẽ hữu ích.
oconnor0

2
Là cuộc gọi kép đến sys.stdin.read()một lỗi đánh máy hoặc một phần của câu trả lời trolling thực sự? Chắc chắn điều đó sẽ khiến OP nản lòng khi đưa mảng làm đầu vào và tiếp tục chờ kết quả ...
Bakuriu

Wow, thật là xấu xa.
Sylverdrag

13
Một O(n)thuật toán sắp xếp. Đẹp.
ejrb

65

Bash, 54 ký tự

Rất nhiều câu trả lời sử dụng các ngôn ngữ kém hiệu quả như C và Python ... chúng ta hãy tăng tốc mọi thứ lên một chút bằng cách đưa ra một giải pháp trong mẹ của tất cả các ngôn ngữ kịch bản: Bash.

Tôi biết bạn đang nghĩ gì - Bash thậm chí không thể xử lý số học dấu phẩy động, vậy nó sẽ được sắp xếp như thế nào, phải không? Chà, tôi thực hiện thuật toán SleepSort hùng mạnh:

#!/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."

Chương trình được cung cấp với đầu vào là đối số dòng lệnh. Chạy mẫu:

> ./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.

Điều này cũng có lợi thế là có lẽ là ngắn nhất trong tất cả các thuật toán làm việc được trình bày ở đây. Điều đó đúng - một dòng bash hùng mạnh , chỉ sử dụng các hàm bash và không gọi bất kỳ nhị phân bên ngoài nào (nghĩa là, nếu bạn không tính đầu ra dài dòng hoàn toàn tùy chọn). Không giống như các bogosort, thời gian chạy của nó là xác định.

Mẹo: Tối ưu hóa hiệu quả là chia số đầu vào cho một yếu tố trước khi sắp xếp. Việc thực hiện được để lại cho người đọc.

Biên tập:

Phiên bản golf rút gọn 54 char với ít in ấn hơn:

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

11
Trolling 1: Thuật toán hoạt động, nhưng rõ ràng là rất chậm - nó sinh ra một luồng cho mỗi số, ngủ trong số giây đó trước khi xuất ra số (theo thứ tự như vậy). Trolling 2: Ngoài ra, hầu hết các mã được dành cho việc viết một bình luận tốt đẹp về số lượng luồng sinh sản của nó, và đọc và phân tích một cách không cần thiết và phân tích thông tin cpu của hệ thống chỉ vì một số đầu ra dài dòng. Trolling 3: Nó xuất ra "mảng được sắp xếp" ở cuối, dường như là điều được thực hiện. Trolling 4: Người dùng không thể hủy "sắp xếp" bằng cách nhấn ctrl-c.
Bạo loạn

4
5. Nó chỉ hoạt động trên GNU / Linux , do sử dụng /proc/cpuinfo.
kps11346

5
Nhân tiện, giải pháp cực kỳ sáng tạo :)
dmitry 28/12/13

8
Thật đáng kinh ngạc. Tôi thậm chí không thể diễn tả nó tuyệt vời như thế nào. Tôi đang cân nhắc sử dụng nó một cách tích cực, vì TẠI SAO KHÔNG.

4
Tôi thực sự có một biến thể của điều này được sử dụng trong sản xuất ở đâu đó. Nhưng trong tình huống đó, thời gian chạy của quá trình rất quan trọng, vì vậy đó là lý do của tôi ...
Riot

64

JavaScript có sort()chức năng tích hợp sẵn, bạn có thể sử dụng nó như thế này:

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

... oh, hoàn toàn quên đề cập đến, nó sắp xếp theo thứ tự từ điển, nghĩa là 10 < 99 < -100. Có lẽ đó là những gì bạn mong đợi nào.


8
Điều đó thậm chí còn tốt hơn bởi vì đó là một chức năng tích hợp.
Wayne Werner

62

(jPL) Ngôn ngữ lập trình jQuery

Bạn phải sử dụng jQuery cho điều đó. Một giải pháp đơn giản cho vấn đề này là giải pháp sau:

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
Tôi đặc biệt thích cách này không thực sự sử dụng jQuery.
KRyan

8
-1 Đặt tên mảng của bạn phải bao gồm ký hiệu Hungary trong đó, cụ thể là các đối tượng jQuery được biểu thị bằng cách sử dụng $, mảng sử dụng avà kết quả window.promptp.
Qantas 94 Nặng

2
"Phần khó khăn" là thanh lịch. OP, phấn đấu để có loại cấu trúc mã một ngày nào đó.
Chris Barker

2
Đó là "xác thực" LOOOOOOOOOOOOL ngày mai được thực hiện! chỉnh sửa cho ít mũ hơn
HC_ 30/12/13

54

C

Giải pháp này kết hợp tính đồng nhất và truy cập cấp hệ điều hành do C cung cấp với các thành phần phần mềm mạnh mẽ, có thể sử dụng lại trong GNU / Linux:

#include <stdlib.h>

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

4
Hoặc một "kịch bản" : #!/usr/bin/sort.
Ốc cơ khí

54

Hồng ngọc

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

Khá tự giải thích.

Hoặc yêu cầu đầu vào thực sự là "một mảng nhân đôi":

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

Không sử dụng gets.chompcho thêm ác. Cũng sử dụng regex sau khi theo dõi cho đến khi, đó là điều mà tôi thậm chí không biết bạn có thể làm (cảm ơn Jan Dvorak) để gây nhầm lẫn cho OP hơn nữa!


4
Mở rộng về ý tưởng, tôi sẽ liên tục yêu cầu đầu vào cho đến khi người dùng nhập chuỗi an array of doubles.
Wrzlprmft

@Wrz Ok, xong :-)
Doorknob

2
Điều đó thật tuyệt vời vì OP nghèo sẽ phải tìm ra cách loại bỏ một dòng mới (vì bạn sử dụng getsthay vì gets.chomp).
wchargein

@WChargin Yep, tôi đã có điều đó trong lần sửa đổi đầu tiên (xem lịch sử sửa đổi) nhưng đã xóa nó để trở nên xấu xa hơn>: D EDIT: Oh chờ, đừng bận tâm, đó là câu trả lời khác của tôi. Tôi sẽ chỉnh sửa cái này :-)
Doorknob

1
+1 Tôi đã tạo một tài khoản ở đây chỉ để nói, đây chính xác là cách tôi sẽ trả lời nó! Yêu nó!
DGM

44

Python3.3

Chắc chắn, đây là chương trình Python đơn giản nhất có thể sắp xếp một mảng được đưa ra dưới dạng một danh sách bằng chữ trên 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)

Thật không may, nó chỉ hoạt động trong python3.3 + vì nó sử dụng yield frombiểu thức. Mã này phải khá tự giải thích, vì vậy bạn không nên có bất kỳ vấn đề gì khi giao nó cho giáo sư của bạn.


Việc trolling là cung cấp một giải pháp hoạt động hoàn hảo , thực hiện chính xác những gì OP dự định, nhưng theo một cách:

  • không thể hiểu (bởi người mới bắt đầu)
  • không thể xử lý với giáo viên vì:
    • OP không thể hiểu nó
    • ngay cả khi anh ta có thể giáo viên sẽ không có thời gian để giải mã để hiểu nó
  • đáng sợ cho một người mới ngây thơ mà có thể nghĩ rằng lập trình là quá khó đối với anh ta

Tóm lại, câu trả lời này sẽ làm tăng đáng kể sự thất vọng của học sinh chế giễu các yêu cầu của họ với các câu trả lời hoàn toàn hợp lệ theo quan điểm nhất định.


(Đừng đọc nếu bạn xem xét một thách thức hiểu mã ở trên)

Tôi phải thêm rằng việc trolling cũng được tăng lên bởi thực tế là thuật toán sắp xếp được thực hiện là thực sự

sắp xếp bong bóng! ... Điều đó chắc chắn có thể được thực hiện theo cách mà ngay cả OP cũng có thể hiểu được. Đây không phải là một thuật toán tối nghĩa, chỉ là một cách mã hóa tốt một cái gì đó mà OP có thể hiểu một cách hoàn hảo.


3
Tôi nghĩ rằng điều này có thể sử dụng giải thích nhiều hơn; Bạn đang làm gì với Địa ngục bây giờ?
KRyan

1
Wow, bạn có thể làm tên biến không ascii trong python? không biết ...
kratenko 27/12/13

1
@kratenko Từ python3 +. Trong python2, trình thông dịch giả định ASCII là mã hóa và sẽ phát sinh lỗi. Trong python3, trình thông dịch giả định UTF-8 là mã hóa và chấp nhận tất cả các ký tự là "chữ cái" bởi các thuộc tính unicode cho mã định danh.
Bakuriu

3
@KRyan: Rõ ràng là anh ta đang sử dụng phương pháp sắp xếp mà Hell sử dụng để đưa mọi người vào chín vòng tròn.
Joe Z.

10
Ôi trời ơi +1 cho è.
Sean Allred

41

C - Kiểu mã hóa chậm, khó sử dụng, không được chấp nhận

Thuật toán sắp xếp chính nó được gọi là làm chậm và có độ phức tạp trường hợp tốt nhất (độ đơn giản) trong khoảng n ^ (log n / 2) . Thuật toán đã được Andrei Broder và Jorge Stolfi xuất bản trong bài báo tuyệt vời "Phân tích thuật toán đơn giản và phân tích đơn giản" mà tôi rất khuyến khích để có tiếng cười và thức ăn ngon.

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

Tuy nhiên, việc tự sắp xếp là vô ích, vì vậy chúng tôi cần một cách để người dùng nhập dữ liệu họ muốn sắp xếp. Phân tích cú pháp nhân đôi là nỗi đau, vậy tại sao không nhập chúng theo từng byte.

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

Để chứng minh rằng nó hoạt động:

 $ 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

Cuối cùng, chúng ta có:

  • Thuật toán sắp xếp xác định chậm nhất mà tôi biết
  • Giới hạn mã hóa im lặng về độ dài danh sách
  • Đầu vào hoàn toàn khủng khiếp, tôi cũng có thể tạo đầu ra tương tự nhưng tôi nghĩ nó hài hước hơn theo cách này.
    • Xem xét: Bạn sẽ cần biết máy của bạn sẽ sử dụng chương trình nào.
    • Ngoài ra, bạn không thể nhập 0 (-0 là ok)
  • Con trỏ mỹ phẩm và hầu như không quan tâm đến các loại vì con trỏ được đúc theo bất kỳ cách nào

Điều này có hành vi không xác định cho tất cả các đầu vào lớn hơn 7 byte. Không phải là một câu trả lời chấp nhận được.
Michael Spencer

1
Yêu bài báo "Thuật toán bi quan"; cảm ơn.
Ryan

Thuật toán sắp xếp xác định chậm nhất Tôi biết về thuật toán - thuật toán sắp xếp xác định chậm nhất có thể chứng minh được . Đó là toàn bộ quan điểm của bài báo, AFAIR.
Konrad Rudolph

@MichaelSpencer Chăm sóc công phu? Tôi đã đưa ra một ví dụ với kích thước đầu vào 24 byte và đầu ra là những gì người ta mong đợi (tôi nghĩ rằng tôi có thể thiếu một trò đùa ở đây).
shiona

2
@Sasho nhưng một bogo-sort có thời gian chạy trường hợp tốt nhất là \ Omega (n) (so sánh n-1, 0 thao tác). Điều đó nhanh hơn nhiều, aka. tệ hơn so với \ Omega (n ^ (log n / 2)).
shiona

39

Ruby, ác quỷ! (Phần thưởng: bogosort theo đầu vào của người dùng)

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 * ","

Các vòng xoắn "ác":

  • chạy thực sự thực sự thực sự thực sự thực sự thực sự thực sự rất chậm, tất nhiên
  • sử dụng so sánh chuỗi, vì vậy 10 nhỏ hơn 2. Có thể dễ dàng sửa lỗi bằng cách .map &:to_fnối vào dòng thứ hai, nhưng OP có thể không biết rằng
  • không sử dụng chompnên số cuối cùng có một dòng mới bí ẩn ở cuối
  • không sử dụng stripnên có khoảng trắng bí ẩn xung quanh các số nếu đầu vào có khoảng cách xung quanh dấu phẩy (ví dụ: khoảng trắng trong 1.5, 2)

Hoặc, làm thế nào về bogosorting bởi đầu vào của người dùng ?! >: 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 * ","

Tại sao không phải là bogobogosort ? (chạy trong thời gian O (n * (n!) ^ n) kỳ
quặc

@Wchargein Tôi có thể xem xét nó :-) bạn có thể quan tâm đến chỉnh sửa gần đây của tôi! (Xin lỗi vì làm chậm, tôi thực sự đang sử dụng điện thoại của mình ngay bây giờ vì tôi không thể truy cập vào máy tính :-P)
Doorknob

37

Bạc hà

Chắc chắn rồi! "Ngay cả một con khỉ cũng có thể làm điều này!"

Đây là một chương trình COBOL đơn giản sẽ sắp xếp đầu vào cho bạn. Đọc các bình luận để xem chính xác nó tầm thường và mở rộng như thế nào. Lợi ích thực sự của việc này là nó đã được thử và cơ chế thực sự, nó không dựa vào các ngôn ngữ mới và tương đối chưa được kiểm chứng như Java và bất kỳ thứ gì dựa trên web hoặc từ Microsoft. Nó biên dịch thực sự hiệu quả và các quy trình như thế này được sử dụng bởi các công ty tài chính thành công nhất trong Fortune500 và các nhà lãnh đạo ngành khác. Mã này đã được xem xét bởi nhiều chuyên gia và được công nhận là một cơ chế tuyệt vời để sắp xếp.

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
Chỉ có bạn mới sử dụng COBOL cho câu trả lời cho câu hỏi này. +1
syb0rg

5
À, mùi tươi của thẻ đục lỗ
Sklivvz

3
@EbenezerSklivvze - LOL. Có lần tôi lấy ra một thẻ đục lỗ mà tôi đang sử dụng làm dấu trang khi giáo sư đại học hội của tôi đang nói với cả lớp về những thẻ đục lỗ thời xưa. Anh ấy đã đủ nổi (đó là vào năm 1994 :). Đừng nghĩ rằng nhiều người cùng thời của tôi đã từng thấy cả một cỗ bài ...
DVK

30

OP không bao giờ nói CÁCH sắp xếp chúng ... hoặc định nghĩa của anh ấy là gì. Giả sử kiểu dữ liệu doublenhưng giải thích nó là trùng lặp . Sử dụng JavaScript tại đây.

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

Kết quả: thứ tự xen kẽ [4, 11, 4, 9, 5, 7, 6, 7]


4
"Giả sử kiểu dữ liệu nhân đôi nhưng diễn giải nó thành bản sao". Chỉ có một thiên tài thực sự sẽ nghĩ như vậy. Chỉ cần rực rỡ!
Felipe Miosso

@FelipeMiosso Thành thật mà nói, tôi không chắc liệu bạn có đang mỉa mai không ...
Kiruse

1
Haha ... tôi đã bị mỉa mai Tôi biết có những người ngoài kia thực sự nghĩ như vậy. Dù sao ... câu trả lời của bạn thật tuyệt vời! Tôi đa cươi rât nhiêu.
Felipe Miosso

@FelipeMiosso Vui mừng tôi có thể giúp làm cho một tiếng cười. ;)
Kiruse

console.log mọi thứ!
Emil Vikström

28

PHP

Dưới đây là một thực hiện đầy đủ với xử lý lỗi. Nó là nhanh nhất cho bất kỳ 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)));

Hoán vị tiếp theo trong C ++ hoạt động bằng cách trả về true khi mảng được sắp xếp và sai nếu không (sau khi nó hoán vị). Vì vậy, bạn phải sắp xếp mảng và sau đó sử dụng nó trong một khoảng thời gian như trên (vì vậy nó sẽ tạo một vòng tròn đầy đủ trở lại mảng đã sắp xếp).


+1 Tôi đã nghĩ về việc sử dụng next_permutationcho câu trả lời của mình, nhưng điều này sạch sẽ hơn rất nhiều so với những gì tôi nghĩ.
jliv902

25

[giải pháp bằng cách đánh giá sai lầm]

Vui lòng đọc tiêu chuẩn có liên quan, Thông số kỹ thuật theo tiêu chuẩn IEC 60559: 1989 cho số học dấu phẩy động nhị phân cho các hệ thống vi xử lý mà bạn có thể mua tại đây . Trong phần chú thích đến §5.10 Chi tiết về vị từ TotalOrder , lưu ý rằng:

TotalOrder không áp đặt tổng thứ tự cho tất cả các bảng mã theo định dạng. Cụ thể, nó không phân biệt giữa các bảng mã khác nhau của cùng một biểu diễn dấu phẩy động, như khi một hoặc cả hai bảng mã không chính tắc.

Vì vậy, chúng tôi thấy rằng không thể viết mã để sắp xếp gấp đôi. Đây là một câu hỏi mẹo. Ha, ha, rất thông minh! Hãy nói với giáo sư của bạn tôi đang tận hưởng khóa học của mình rất nhiều.

[chỉnh sửa: không có gì yêu cầu tôi không cho rằng vấn đề cần tổng đơn hàng]


3
Nhưng vấn đề là sắp xếp gấp đôi. Không ai yêu cầu các giá trị phải theo thứ tự (tổng). Ví dụ, bạn có thể sắp xếp mảng thành hai, số dương và số âm. Bạn đã bị nghi ngờ bởi câu hỏi.
shiona

23

Một JavaScript ác:

OP, tôi không muốn cung cấp cho bạn mọi thứ vì vậy tôi sẽ cho phép bạn tự tìm cách lấy đầu vào từ người dùng (gợi ý: sử dụng prompt).

Khi bạn đã có nó, đây là một chức năng bạn có thể truyền mảng của mình vào để sắp xếp nó. Bạn chỉ cần cung cấp mảng, giá trị thấp nhất trong mảng và gia tăng:

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

Dưới đây là một mẹo để xem nó hoạt động với đầu vào người dùng mẫu [1.5, -3,5, 12, 10, -19,5].


Lưu ý: Ngoài việc hoạt động kém, phức tạp và không thể giải quyết được vấn đề trong tay, điều này sẽ đặc biệt gây khó chịu nếu OP không biết về toán học dấu phẩy động. Ví dụ: nếu đầu vào của người dùng là [8.1, 5, -.8, 2.3, 5.6, 17.9]và OP chọn các giá trị đơn giản (nghĩa là minimumVal=-.8increment=.1), chương trình sẽ chạy mãi mãi. Về một lưu ý liên quan, tôi hiện là chủ sở hữu tự hào của 2 tab trình duyệt không hoạt động do chính vấn đề này :)

Lưu ý II: Tôi cảm thấy kinh tởm ngay cả khi viết đoạn mã trên.

Lưu ý III: MWA HAHAHAHA!


Ý kiến ​​hay. Bạn hẳn đã rất tuyệt khi còn là một người mới lập trình.
Pierre Arlaud

22

Đây là một câu trả lời thực tế mà tôi thích cho Java:

Thêm dòng trước khi println và mảng của bạn được sắp xếp

Arrays.sort( array );

Không có lời giải thích, gây nhầm lẫn cho OP , nhưng hoạt động và sẽ nhận được sự ủng hộ từ các lập trình viên giàu kinh nghiệm hơn.


Một câu trả lời tương tự khác :

Hãy xem Arrays.sort ()

Gián tiếp bảo OP thực hiện nghiên cứu của riêng mình đồng thời cho anh ta một câu trả lời đúng mơ hồ. Không có nghiên cứu thêm, OP vẫn còn bối rối . Tôi cũng thích rằng các liên kết trỏ đến tài liệu cũ.


10
Điều này là hữu ích và do đó xứng đáng để bỏ phiếu.
emory

11
"Gián tiếp bảo OP thực hiện nghiên cứu của riêng mình trong khi đưa ra câu trả lời đúng mơ hồ" mô tả khá nhiều về cách trả lời StackOverflow của tôi: /
Corey Goldberg

7
"Hãy xem Arrays.sort ()" ... "Tôi có thể lấy ví dụ về cách sử dụng nó trong chương trình của mình không?" ... xuất sắc.
SimonT

5
+1 đặc biệt bởi vì OP khiêm tốn của chúng ta có lẽ cần phải viết một loại anh ấy / cô ấy cho một lớp, làm cho Array.sort () hoàn toàn vô dụng với anh ấy / cô ấy.
Kevin

2
Ctrl + F -> "Tôi có thể lấy ví dụ về cách sử dụng nó trong chương trình của mình không?" = 3 kết quả.
Qix 30/12/13

21

Thuật toán di truyền / phương pháp Monte Carlo cho vấn đề sắp xếp trong JAVA

Vấn đề sắp xếp được biết đến với khoa học máy tính trong một thời gian dài và nhiều giải pháp tốt đã được tìm thấy. Trong những năm gần đây, đã có những tiến bộ lớn trong máy tính sinh học và xem xét cách sinh học giải quyết các vấn đề đã được chứng minh là giúp ích rất nhiều trong việc giải quyết các vấn đề khó khăn. Thuật toán sắp xếp này sử dụng tốt nhất những ý tưởng này để sử dụng chúng để giải quyết vấn đề sắp xếp. Y tưởng nay đơn giản qua. Bạn bắt đầu với một mảng không có thứ tự và tìm hiểu cách sắp xếp thứ này. Bạn cho nó điểm "sắp xếp" của nó và sau đó hoán vị mảng với một thành phần ngẫu nhiên - giống như trong sinh học, nơi không rõ trẻ em sẽ trông như thế nào ngay cả khi bạn biết tất cả về cha mẹ! Đây là phần thuật toán di truyền. Bạn tạo ra con đẻ của mảng đó để nói. Sau đó, bạn thấy nếu con cái được sắp xếp tốt hơn so với bố mẹ (hay còn gọi là sự sống sót của đứa trẻ khỏe nhất!). Nếu đây là trường hợp bạn tiếp tục với mảng mới này làm điểm bắt đầu để xây dựng hoán vị tiếp theo và cứ thế cho đến khi mảng được sắp xếp đầy đủ. Điều thú vị về cách tiếp cận này là nó ngắn hơn, nếu mảng đã được sắp xếp một chút từ đầu!

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

}

Ngoài ra

  • Lạm dụng java.awt.List
  • đặt tên biến không nhất quán và xấu
  • hoàn toàn nhảm nhí blah blah về máy tính sinh học
  • ngôn ngữ sáng tạo và không nhất quán trong giải thích
  • monte carlo rõ ràng là công cụ sai cho các vấn đề xác định thẳng về phía trước
  • nhập khẩu không cần thiết
  • có lẽ nhiều điều tốt hơn ...

Là gọi GA hoặc Monte Carlo một cấp độ troll khác? Tôi tin rằng đây là một thuật toán leo đồi ngẫu nhiên.
shiona

liên kết chương trình này với các tên từ thông dụng là có chủ ý, nhưng tôi chưa bao giờ nghe nói về "thuật toán leo đồi ngẫu nhiên" cả ... và theo nghĩa rộng hơn, tôi nghĩ GA và Monte Carlo không quá xa để bị nhầm lẫn ...
luksch

19

Con trăn

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

Sắp xếp các mảng (danh sách) bằng tổng của 3 thứ 5 thứ chữ số thập phân.


5
Thật không may, điều này được sửa chữa một cách tầm thường bằng cách loại bỏ mọi thứ sau đó lambda x:và thay thế nó bằng x. Tuy nhiên, một lập trình viên mới bắt đầu sẽ không bao giờ biết điều đó, vì vậy, kudos!
Joe Z.

18

C ++

Điều này hoạt động ... cuối cùng.

Đây là thuật toán sắp xếp của tôi:

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

Đây là chương trình đầy đủ:

#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
Thuật toán sắp xếp của bạn đã làm tôi rơi nước mắt.
Nate

Hah, đó không phải là một thuật toán vì nó không được cấp để kết thúc>: D
jmaceso 31/12/13

@joxnas, thực sự trên các hệ thống không có sẵn các thiết bị ngẫu nhiên không xác định, bộ ngẫu nhiên thực sự có thể là định kỳ. Sau đó, nó chỉ đơn giản phụ thuộc vào việc tập hợp các hoán vị có thể được cho phép bởi bộ ngẫu nhiên có cho phép tập hợp các hoán vị có thể $ S_n $ cho tất cả các độ dài mảng đầu vào có thể $ n $ hay không.
lỗi

Ôi, tôi quên LaTeX chỉ được hỗ trợ trên TeX.SE và Math.SE. Chỉ cần tưởng tượng những biểu tượng trong italix snooty.
lỗi

18

Đây, bữa tiệc mắt của bạn:

<?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>

Đoạn mã này hiển thị mảng và yêu cầu người dùng nhập số kép nhỏ nhất của mảng. Sau đó, nó thêm số vào danh sách các số được sắp xếp, loại bỏ số kép khỏi mảng và hiển thị các số mảng còn lại.

* Giải thích sai: Điểm yếu, nhưng OP không chính xác mong đợi chương trình yêu cầu người dùng giúp sắp xếp.

* Gian lận: người dùng là người thực hiện phân loại thực tế.

* Hiệu suất: Mỗi số của mảng yêu cầu một vòng máy chủ và nó yêu cầu người dùng tìm số nhỏ nhất theo cách thủ công. Hiệu suất không thể tệ hơn nhiều.

* Không thể chấp nhận: Tôi nghĩ rằng tôi đã được bảo hiểm. Và chúc may mắn khi tái sử dụng nó. Tệ nhất đến tồi tệ nhất, người dùng có thể loại bỏ 90% mã và lặp đi lặp lại để tìm các giá trị nhỏ nhất và loại bỏ chúng mỗi lần, điều này sẽ cho anh ta một trong những thuật toán sắp xếp kém hiệu quả nhất.

* Sáng tạo và xấu xa: bạn nói với tôi.


2
Bạn nói 'hãy nhìn vào mắt bạn' và đưa cho tôi PHP Oo
Aidiakapi

3
"Ác" là một phần của yêu cầu, phải không?
Sylverdrag

17

Javascript Sắp xếp thiết kế thông minh

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
Tín dụng mà tín dụng là do: dangermouse.net/esoteric/intelligentdesignsort.html
wchargin

1
Không hiểu tại sao bạn bash thiết kế thông minh trong một cuộc thi lập trình?
khebbie

12
@khebbie Tại sao không?
Konrad Rudolph

Vấn đề là, nếu người dùng là người nhập số, thì họ sẽ thông minh hơn chính họ. ;)
d -_- b

16

Python - req. # 1

Mã này sẽ sắp xếp các nhân đôi theo thứ tự từ vựng thay vì tăng thứ tự số, bằng cách tạo một cây tiền tố gồm các chữ số và sau đó lặp qua chúng một cách đệ quy.

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ó hoạt động n log nđúng lúc và trên thực tế là một cách thông minh để giữ một danh sách được sắp xếp theo cách khác, nhưng thật không may cho OP, nó hoàn toàn sai.


4
Điều đặc biệt nữa là nếu tất cả các số có cùng số chữ số trước dấu thập phân, thì nó thực sự sẽ hoạt động chính xác, do đó OP thậm chí có thể không nhận thấy rằng sắp xếp đó đang làm gì đó sai nếu anh ta chỉ kiểm tra nó bằng cách sử dụng đầu vào của , nói, 2, 1, 3, 8, 5.
Joe Z.

14

Sắp xếp các mảng của đôi. Trong 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;}

Ví dụ:

[0.0, 1.5, 123]

đi từ đại diện nhị phân chưa được sắp xếp của

011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000

để sắp xếp thanh lịch

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111


11

Tôi cần một chương trình trong đó người dùng nhập một mảng tăng gấp đôi và chương trình xuất ra mảng được sắp xếp. Bạn có thể vui lòng cho mã?

Chỉnh sửa mỗi @kealist, tôi đoán sẽ tốt hơn nếu được bình luận để làm cho sự phân chia có vẻ hợp lý. Trong 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

Phát huy ý tưởng rằng họ thực sự không biết gấp đôi là gì và có thể tin rằng một danh sách các số nhân đôi chỉ là một nhóm các số nhân với hai.


6
Có lẽ họ cần phải giảm một nửa vì đầu vào đã tăng gấp đôi!
kealist 27/12/13

@kealist Tôi đã xem xét điều đó, tuy nhiên điều này diễn ra trên ý tưởng rằng "nhân đôi" đang diễn ra. Tôi nghĩ rằng nó sẽ lẻn hơn một chút để có [2 * num].
Bác sĩ Rebmu

10

Cố tình hiểu nhầm câu hỏi:

Sử dụng phương pháp đệ quy:

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

Mảng được sắp xếp được đảm bảo được xuất ra tại một số điểm, cho bất kỳ loại dữ liệu nào trong mảng, thậm chí bất kỳ loại thứ tự sắp xếp nào, và thậm chí bất kỳ loại dấu tách nào cho đầu vào, làm cho cách tiếp cận này cực kỳ linh hoạt. Hạn chế chính của nó là hơi chậm đối với các mảng lớn, nhưng bạn có thể giải quyết điều đó một cách dễ dàng với đa luồng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.