我需要一个程序,用户输入一个双精度数组,并且程序输出该数组排序


280

注意:自从我第一次在此处发布问题以来,对该问题进行了严格的编辑。规则已移至此处,在发布任何答案之前请仔细阅读它们以了解其目的。这是在类别中创建的第一个问题。

想象一下,在Stack Overflow上一个懒惰的用户问这个问题:

我需要一个程序,用户输入一个双精度数组,该程序输出已排序的数组。您能给我密码吗?

您如何创建一段代码来欺骗该用户?创建一段代码,这些代码对于没有经验的程序员似乎很有用,但实际上却毫无用处。

获胜者是最upvoted答案,但如果答案是不知何故没有资格(资格要求,检查标签Wiki描述)。如果在接受之后在投票数上击败了先前获得最高投票的答案,则新的最佳答案会被接受,而前一个答案将不被接受。如果是平局,我会在平局中任意选择获胜者,或者再等等。

没有代码的答案不符合条件。他们可能很有趣并且获得了一些投票,但是他们不会被接受。

规则可在标签说明中找到。

注意:这是一个询问问题。请不要认真对待问题和/或答案。更多信息在这里



6
@bluesm如果某人已经决定让别人解决他们的问题,而不是“浪费”自己的时间学习,那么发布指向他们自己可以学习的地方的链接将无济于事。
IQAndreas

3
哇,这个问题即将在不到24小时内获得100票赞成和10,000次观看!
Joe Z.

18
我的天哪,维克多(Victor),您的“关于”框太难过了……我们所有人都有起有落,但您不应该把自己打败。您现在是各地各地的Code Golfers的英雄!
SimonT

4
我很惊讶,没有人提供了基于解决睡眠排序尚未
弗兰克农民

Answers:


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,for 1st, 2th, 3th, 4th...和下层运算符-非常先进的C编程技术。
卡亚

5
应该使用sscanf(input, "%5s", &input[0]),否则在解析输入时可能会出现溢出错误。并且应该声明input char input[sizeof(int)+1],以便与64位系统向后兼容。
2013年

12
i==1?"st":"th"哈哈哈...
盖·西顿2013年

15
Java具有垃圾回收。因此,Java是用于“脚本”的,而不是真正的编程。这是基本的CS101。(巨魔这样说。)
AShelly

181

它在Java中。它完全是作弊的,无法接受的和不可修复的,因为它创建了一个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编码人员来说,将解决方案与规范匹配是可以接受的!
Rebmu博士2013年

10
还考虑需要对大量对象进行排序的情况。在数据库中“在程序外部”对它们进行排序是一种可行的解决方案。
维克多·塞弗特

40
这里没有足够的抽象。您至少需要10个接口,20个实现,枚举,单元测试,覆盖率测试,Maven,集成测试,
模拟

6
@NaftuliTzviKay我们应该创建一个MySQLSortEnterpriseEdition来实现您的想法。Victor是否会同意在此处使用GPL许可代码,以便我们开始使用?
Joe Z.

14
@JoeZ。是的,我的回答缺少关于许可模型的评论,我应该让用户在程序开始时接受EULA。但是,由于我将其提供给惰性OP,因此它可免费用于非商业用途,包括可用于创建期待已久的高级MySQLSortEnterpriseEdidtion。
维克多·斯塔夫萨

142

C#-没有像杀戮一样的杀戮

首先,亲爱的GiMmEtHaCoDeZ,让我们尝试分解您的任务:

  1. 阅读数字
  2. 排序
  3. 输出排序的数字。

由于“分而治之”是处理软件问题时非常重要的策略,因此请一次解决一个问题

1.阅读

软件中的另一个重要问题是多功能性。由于未指定用户如何输入数字,因此可以通过控制台,文件,Web服务等进行。甚至可能是我们目前无法想到的某些方法。因此,重要的是我们的解决方案能够容纳各种类型的输入。例如,最简单的方法是将重要部分提取到接口中

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

在哪里,例如我们可以定义readerwriterprocessor使用

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

49
大声笑,ListSort企业版©:-P +1
Doorknob

14
+1为疯狂的过度编码。建议您将答案分为3个或更多“模块”答案,以便我可以分别对其进行+1
greggo 2013年

15
最重要的是,它实际上是在使用库排序:)完全符合规范,完全没有用
SWeko 2013年

9
那...真漂亮。
安德鲁

7
使用DI只会混淆OP,因为这只是一个简单的例子。
SWeko

132

更直截了当的解释:

echo " aaehrrty"

也就是说,“数组”已排序。


5
我来这里发布这个。
Quuxplusone

5
另存为文件sort.sh并称为sh sort.sh "an array of doubles"
Kyss Tao

我认为您错过了“用户输入了一个双精度数组”。
Dukeling 2014年

1
@Dukeling就是Kyss Tao的评论的重点。"an array of doubles"可以作为命令行参数传递给脚本。
AJMansfield 2014年

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脚本一样可理解:)
Corey Goldberg 2013年

6
@swelljoe实际上,此时$_是一个空字符串。我将所需的输出存储在中$\ ,这是输出记录分隔符。
PhiNotPi

4
@安迪简单。“它是如何工作的?”
John Dvorak 2013年

1
并且所有用户创建的变量都有漂亮的名称,它们遵循所有可行的约定
Hagen von Eitzen 2013年

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
呵呵,这实际上使我大笑。无论如何,我同意更好的解释会有所帮助。
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内置函数而不调用任何外部二进制文件(也就是说,如果您不计算纯粹的可选详细输出)。与bogosorts不同,其运行时是确定性的。

提示:有效的优化方法是在排序之前将输入数字除以一个因子。具体实施由读者自己决定。

编辑:

缩短了54个字符的高尔夫球版,减少了漂亮的印刷:

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

11
拖钓1:该算法确实有效,但显然可能非常慢-它为每个数字生成一个线程,在输出该数字之前休眠该秒数(因此按顺序进行)。Trolling 2:此外,大多数代码都花在写一个有关其产生多少线程的不错的注释上,并且不必要地和无偿地读取和解析系统的cpu信息只是为了一些额外的冗长输出。拖钓3:最后输出“已排序的数组”,这似乎已完成。拖曳4:用户无法通过按ctrl-c取消“排序”。
骚乱

4
5. 由于使用,因此只能在GNU / Linux上使用/proc/cpuinfo
kps11346 2013年

5
顺便说一句,非常有创意的解决方案:)
德米特里(Dmitry)2013年

8
这真太了不起了。我什至无法表达那是多么的棒。我正在考虑积极使用它,因为不是。

4
实际上,我确实确实在生产中的某个地方使用了此变量。但是在那种情况下,流程的运行时间很重要,所以这是我的借口……
Riot 2013年

64

JavaScript具有内置sort()功能,您可以像这样使用它:

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

...哦,完全忘了提,它按字典顺序(即10 < 9和)排序9 < -100。无论如何,这可能就是您所期望的。


8
更好,因为它是内置函数。
韦恩·沃纳

62

(jPL)jQuery编程语言

必须为此使用jQuery。以下是该问题的一种简单解决方案:

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

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

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

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

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

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

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

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

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

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

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

jSort();


55
我特别喜欢这如何不实际使用jQuery。
KRyan 2013年

8
-1您的数组命名中必须包含匈牙利符号,特别是使用表示的jQuery对象,使用的$数组awindow.promptas的结果p
澳洲航空94年重型

2
“微妙的部分”是优雅的。OP,有朝一日努力拥有这种代码结构。
克里斯·巴克

2
那个F'n doble的“验证”是LOOOOOOOOOOOOL omg omg天造的!编辑为减少上限
HC_13年

54

C

该解决方案将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用于额外的邪恶。在跟踪到之后也使用正则表达式,这是我什至不知道您可以做的事情(感谢Jan Dvorak),甚至使OP更加混乱!


4
扩展这个想法,我会反复要求输入,直到用户输入string为止an array of doubles
Wrzlprmft

@Wrz好,完成了:-)
门把手

2
这样做特别好,因为糟糕的OP将必须弄清楚如何摆脱换行符(因为您使用gets而不是gets.chomp)。
wchargin

@WChargin是的,我在第一个修订版中有此要求(请参阅修订历史记录),但将其删除后变得更加邪恶>:D编辑:哦,等等,没关系,这是我的另一个答案。我将编辑这一个:-)
门把手

1
+1我在这里创建了一个帐户,只是说,这就是我的答案!爱它!
DGM

44

Python3.3

当然,这是最简单的 Python程序,可以对stdin上作为列表文字给出的数组进行排序:

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

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



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

不幸的是,由于它使用yield from表达式,因此仅在python3.3 +中有效。该代码应该是不言自明的,因此将其交给教授时,您应该不会有任何问题。


所要解决的问题是提供一种完全可行的解决方案,该解决方案完全符合OP的意图,但方式是:

  • 无法理解(初学者)
  • 无法与老师打交道,因为:
    • OP无法理解
    • 即使他可以,老师也没有时间去理解它
  • 对于一个天真的新手来说很恐怖,他可能认为编程对他来说太难了

总之,从某个角度来看,这个答案将大大增加学生嘲笑他们的请求并获得完全有效答案的挫败感。


(如果您在理解上面的代码时遇到挑战,请不要阅读)

我还必须补充一点,由于实施的排序算法实际上是

泡沫排序!...这肯定可以以OP都可以理解的方式实施。它本身并不是一个晦涩的算法,只是对OP可以很好理解的某些东西的很好的代码混淆。


3
我认为这可以使用更多的解释;你现在对地狱正在做什么?
KRyan 2013年

1
哇,您可以在python中做非ascii变量名吗?不知道……
kratenko 2013年

1
@kratenko来自python3 +。在python2中,解释器将ASCII假定为编码,并且会引发错误。在python3中,解释器将UTF-8假定为编码,并接受unicode属性的所有“字母”字符作为标识符。
Bakuriu

3
@KRyan:他显然正在采用地狱用来将人们带入九个圈子的排序方法。
Joe Z.

10
我的天哪…è+1。
肖恩·艾瑞德

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
喜欢“最小算法”论文;谢谢。
瑞安

“我知道的最慢的确定性排序算法” – 可证明的最慢的确定性排序算法。这就是论文的重点。
康拉德·鲁道夫2013年

@MichaelSpencer Care详细说明吗?我举了一个输入大小为24个字节的示例,输出是一个期望的结果(我想我可能在这里丢了个玩笑)。
shiona

2
@Sasho,但bogo-sort的最佳运行时间为\ Omega(n)(n-1个比较,0个操作)。那又快得多。比\ Omega(n ^(log n / 2))更糟糕。
shiona 2013年

39

露比,邪恶的Bogosort!(奖金:由用户输入的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),则数字周围会有神秘的空格

或者,如何通过用户输入进行 bogosorting ?>: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 2013年

@Wchargin我可能会考虑:-)您可能对我最近的编辑感兴趣!(很慢,很抱歉,由于无法访问计算机,我现在正在接电话:-P)
Doorknob

37

科宝

当然!“甚至猴子也可以做到这一点!”

这是一个简单的COBOL程序,它将为您排序输入。阅读评论,看看它到底有多琐碎和可扩展。这样做的真正好处是,它是一种久经考验的真正机制,它不依赖于Java和未经测试的新语言,例如Java和任何基于Web的语言或来自Microsoft的语言。它可以真正有效地进行编译,并且财富500强中最成功的金融公司和其他行业领导者都使用这种程序。该代码已经过许多专家的审查,被认为是一种很好的分类机制。

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 2013年

5
啊,打孔卡的新鲜味道
Sklivvz 2013年

3
@EbenezerSklivvze-哈哈 当我的装配学院教授向班级讲解旧的打孔卡时,我曾经拿出一张我用作书签的打孔卡。他的地板足够宽(那是在1994年:)。不要以为我的许多同时代人看到过整个甲板……
DVK

30

OP从未说过如何对它们进行排序...或者他对double的定义是什么。假定数据类型,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 2013年

@FelipeMiosso说实话,我不确定您是否只是在讽刺……
Kiruse 2013年

1
哈哈...我在讽刺。我知道外面有人真的这么想。无论如何...您的回答是史诗般的!我常笑。
Felipe Miosso 2013年

@FelipeMiosso很高兴我可以帮忙大笑。;)
Kiruse 2013年

console.log一切!
EmilVikström2013年

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(在排列之后)来工作。因此,您应该对数组进行排序,然后按上述方式在do-while中使用它(这样它将使整圈返回排序后的数组)。


+1我考虑过要使用next_permutation答案,但这比我想的要干净得多。
jliv902 2014年

25

[通过错误的方向解决方案]

请阅读相关标准IEC 60559:1989 微处理器系统的二进制浮点算术规范,您可以在此处购买。在§5.10totalOrder谓词的详细信息的脚注中,应指出:

totalOrder不会对格式中的所有编码施加总排序。尤其是,它不会区分同一浮点表示形式的不同编码,就像当一种或两种编码都不规范时一样。

因此,我们看到不可能编写代码来对double进行排序。这是一个技巧问题。哈哈哈,非常聪明!请告诉你的教授,我很喜欢他的课程。

[编辑:没有什么要求我不要认为问题需要总订单]


3
但是问题是对双打进行排序。没有人要求这些值按(总计)顺序排列。例如,您可以将数组分为两个正数和负数。你被这个问题吓到了。
shiona 2013年

23

邪恶的JavaScript:

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个无法正常运行的浏览器标签的骄傲所有者:)

注意二:即使编写上面的代码,我也感到恶心。

注意三: MWA哈哈哈哈!


好主意。当您还是编程新手时,您一定很酷。
皮埃尔·阿洛德

22

这是我喜欢Java 的实际答案

在println之前添加一行,然后对数组进行排序

Arrays.sort( array );

没有任何解释,会使OP感到困惑,但是可以正常工作,并且会得到更有经验的程序员的支持。


另一个类似的答案

看看Arrays.sort()

间接告诉OP进行自己的研究,同时给他一个模糊的正确答案。没有进一步的研究,OP仍然很混乱。我也喜欢该链接指向较旧的文档。


10
这很有用,因此值得一票。
emory

11
“间接告诉OP进行自己的研究,同时给他一个模糊的正确答案”,几乎描述了我StackOverflow回答的风格:/
Corey Goldberg 2013年

7
“看看Arrays.sort()”……“我能举个例子说明如何在程序中使用它吗?” 太棒了
SimonT

5
+1尤其是因为我们不起眼的OP可能需要为一个类编写一个他/她自己的排序,从而使Array.sort()对他/她完全无用。
凯文

2
Ctrl + F->“我可以举个例子说明如何在程序中使用它吗?” = 3个结果。
Qix

21

JAVA中排序问题的遗传算法/蒙特卡罗方法

排序问题是计算机科学很久以来就知道的问题,并且已经找到了许多好的解决方案。近年来,生物计算领域取得了长足的进步,研究生物学如何解决问题已显示出对解决难题的巨大帮助。该排序算法充分利用了这些想法,可以将其用于解决排序问题。这个想法很简单。您从无序数组开始,然后找出其排序方式。您给它的“分类度”打分,然后用随机成分对阵列进行排列-就像在生物学中一样,即使您对父母一无所知,孩子们的模样也不清楚!这是遗传算法的一部分。您可以说创建了该数组的后代。然后,您可以查看后代是否比父代排序更好(又称优胜劣汰!)。如果是这种情况,则以这个新数组为起点继续构建下一个排列,依此类推,直到对数组进行完全排序为止。如果从一开始就已经对数组进行了排序,那么这种方法的妙处就是它需要更短的时间!

package testing;

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

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


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


    public static void main(String[] args) {


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

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


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

        String input = null;

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

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


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

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



        printCurrentListAndStuff(doubleList);

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

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

            }

        }

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

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

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

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

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

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

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

        }
        return newList;

    }

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

}

附加功能

  • 滥用java.awt.List
  • 变量命名不一致且错误
  • 关于生物计算完全是胡说八道
  • 说明中的创造性和不一致的语言
  • 蒙特卡洛显然是直接解决确定性问题的错误工具
  • 不必要的进口
  • 可能还有更多好东西...

将此GA或Monte Carlo称为另一个巨魔吗?我相信这是一个随机的爬山算法。
shiona 2013年

将该程序与流行语名称相关联是有意的,但是我也从未听说过“随机爬山算法”……从广义上讲,我认为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)

排序由3的总和的阵列(列表)RD和5 位小数。


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 2013年

@joxnas,实际上在没有确定性随机设备的系统上,随机化器实际上可能是周期性的。然后,将仅取决于随机化器允许的可能排列的集合是否包含所有可能的输入数组长度$ n $的可能排列的集合$ S_n $。
错误

糟糕,我忘记了LaTeX仅在TeX.SE和Math.SE上受支持。试想一下,在贪婪的italix中使用这些符号。
错误

18

在这里,大饱眼福:

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

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

}
?>

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

这段代码显示了数组,并要求用户输入数组的最小两倍。然后将数字添加到已排序数字列表中,从数组中删除双精度数并显示剩余的数组数字。

*误解:弱点,但是OP并不完全希望程序要求用户帮助排序。

*作弊:用户是进行实际排序的人。

*性能:阵列中的每个数字都需要服务器往返,并且需要用户手动找到最小的数字。性能不会变得更糟。

*不能接受:我想我已经覆盖了。祝您重用它。最糟糕的是,用户可能会摆脱90%的代码,然后反复遍历以查找最小值并每次删除它们,这将使他成为效率最低的排序算法之一。

*创意与邪恶:你告诉我。


2
您说“大饱眼福”,然后给我PHP Oo
Aidiakapi

3
“邪恶”是要求的一部分,不是吗?
Sylverdrag

17

Javascript智能设计排序

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

6
归功于应归功的
wchargin 2013年

1
不明白为什么在编程竞赛中抨击智能设计?
khebbie 2013年

12
@khebbie为什么不呢?
康拉德·鲁道夫2013年

问题是,如果用户是输入数字的用户,那么他们将比自己更聪明。;)
d -_- b

16

Python –要求 #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

对双精度数组进行排序。在Java中:

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

例如:

[0.0, 1.5, 123]

源自的未排序的二进制表示形式

011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000

到优雅的排序

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111


11

我需要一个程序,用户输入一个双精度数组,该程序输出已排序的数组。您能给我密码吗?

根据@kealist编辑,我想最好是发表评论以使分歧似乎合理。在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 2013年

@kealist我认为,但是这是基于“正在加倍”的想法。我认为使用[2 * num]要好一些。
Rebmu博士2013年

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

对于数组中的任何类型的数据,甚至是任何种类的排序顺序,甚至是输入的任何分隔符,都可以保证在某些时候输出排序后的数组,这使得此方法非常灵活。它的主要缺点是,对于大型阵列,它有点慢,但是您可以使用多线程轻松解决。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.