ฉันต้องการโปรแกรมที่ผู้ใช้ป้อนอาร์เรย์เป็นสองเท่าและโปรแกรมจะเรียงลำดับแถวลำดับ


280

หมายเหตุ: คำถามนี้ได้รับการแก้ไขอย่างรุนแรงตั้งแต่ฉันโพสต์ครั้งแรกที่นี่ กฎถูกย้ายไปที่นี่อ่านก่อนโพสต์คำตอบใด ๆ เพื่อทำความเข้าใจวัตถุประสงค์ของการนี้ นี่เป็นคำถามแรกที่สร้างขึ้นในหมวดการ

ลองนึกภาพผู้ใช้ที่ขี้เกียจใน Stack Overflow ถามคำถามนี้:

ฉันต้องการโปรแกรมที่ผู้ใช้ป้อนอาร์เรย์เป็นสองเท่าและโปรแกรมจะเรียงลำดับแถวลำดับ คุณช่วยบอกรหัสได้ไหม

คุณจะสร้างรหัสที่จะหมุนรอบผู้ใช้นี้ได้อย่างไร สร้างชิ้นส่วนของรหัสที่จะเป็นประโยชน์กับโปรแกรมเมอร์ที่ไม่มีประสบการณ์ แต่ไม่มีประโยชน์อย่างเต็มที่ในทางปฏิบัติ

ผู้ชนะคือคำตอบที่ได้รับการโหวตมากที่สุดยกเว้นว่าคำตอบนั้นไม่เหมาะสม (สำหรับคุณสมบัติที่เหมาะสมให้ตรวจสอบคำอธิบาย wiki ของแท็ก wiki ของ ) หากคำตอบที่ถูกโหวตขึ้นมากที่สุดก่อนหน้านี้ถูกเอาชนะในอนาคตในจำนวนผู้อัปโหลดหลังจากที่ได้รับการยอมรับคำตอบที่ดีที่สุดใหม่จะได้รับการยอมรับและคำตอบก่อนหน้านี้จะไม่ได้รับการยอมรับ ในกรณีที่เสมอกันฉันจะเลือกผู้ชนะที่จะเป็นคนที่ถูกมัดหรือรออีกสักหน่อย

คำตอบที่ไม่มีรหัสไม่มีสิทธิ์ พวกเขาอาจสนุกและได้รับการโหวตสูง แต่พวกเขาจะไม่ได้รับการยอมรับ

กฎสามารถพบได้ที่คำอธิบายแท็ก

หมายเหตุ: นี่เป็นคำถามการกรุณาอย่าใช้คำถามและ / หรือคำตอบอย่างจริงจัง ข้อมูลเพิ่มเติมที่นี่



6
@bluesm หากมีคนตัดสินใจแล้วว่าจะขอให้คนอื่นแก้ปัญหาแทนที่จะ "เสียเวลา" การเรียนรู้ของตนเองการโพสต์ลิงก์ไปยังที่ที่พวกเขาสามารถเรียนรู้ได้ด้วยตัวเองจะไม่ทำอะไรเลย
IQAndreas

3
ว้าวคำถามนี้กำลังจะได้รับ upvotes 100 ครั้งและ 10,000 ครั้งในเวลาน้อยกว่า 24 ชั่วโมง!
Joe Z.

18
ความดีของฉันวิกเตอร์กล่องเกี่ยวกับของคุณช่างเศร้าเหลือเกิน ... พวกเราทุกคนมีทั้งขาขึ้นและขาลง แต่คุณไม่ควรเอาชนะตัวเอง ตอนนี้คุณเป็นฮีโร่ของ Code Golfers แล้ว!
SimonT

4
ฉันประหลาดใจที่ไม่มีใครได้เสนอวิธีการแก้ปัญหาบนพื้นฐานของการนอนหลับการจัดเรียงเลย
แฟรงก์ชาวนา

คำตอบ:


178

บางครั้งชุมชนที่นี่ไม่ต้องการช่วยทำการบ้าน นั่นเป็นเหตุผลที่คุณได้รับคำตอบเรื่องตลกมากมาย แต่ฉันชอบที่จะช่วย นี่เป็นคำตอบที่สมบูรณ์ใน 'C' (เนื่องจากฉันถือว่าคุณต้องการเรียนรู้ "การเขียนโปรแกรม" ไม่ใช่ "การเขียนสคริปต์" ด้วย Java หรือ Ruby) ฉันได้รวมเคล็ดลับมากมายที่ฉันหวังว่าฉันจะได้รู้เมื่อฉันเรียนรู้ครั้งแรก

#include <stdio.h>

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

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

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

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

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

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

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

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

32
คำแนะนำเกือบทั้งหมดผิดและเพียงแค่ขอรายการอินพุตจนกว่าคุณจะป้อนมันเรียงลำดับแล้ว
AShelly

47
+1 สำหรับ1st, 2th, 3th, 4th...และตัวดำเนินการ downto - เทคนิคการตั้งโปรแกรม C ขั้นสูงมาก
Kaya

5
ควรใช้sscanf(input, "%5s", &input[0])มิฉะนั้นอาจมีข้อผิดพลาดมากเกินไปขณะแยกวิเคราะห์อินพุต และควรประกาศอินพุตchar input[sizeof(int)+1]สำหรับความเข้ากันได้ย้อนหลังกับระบบ 64 บิต
sh1

12
i==1?"st":"th"ฮ่าฮ่าฮ่า ...
Guy Sirton

15
Java มีการรวบรวมขยะ ดังนั้น Java สำหรับ "การเขียนสคริปต์" ไม่ใช่การเขียนโปรแกรมจริง นั่นเป็นพื้นฐาน CS101 (ดังนั้นโทรลล์กล่าว)
AShelly

181

ที่นี่มันอยู่ในจาวา มันเป็นการโกงที่ยอมรับไม่ได้และไม่สามารถแปลได้เพราะมันสร้างฐานข้อมูล MySQL ใส่ตัวเลขที่นั่นทำการเลือกด้วยคำสั่งย่อย ORDER BY และส่งผลตัวเลขที่ MySQL กำหนด ในความเป็นจริงมันเป็น MySQL ที่ทำการเรียงลำดับไม่ใช่โปรแกรม

package sorter;

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

public class SortingAlgorithm {

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

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

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

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

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

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

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

103
ที่จริงแล้วอยู่ใกล้กับบ้านมากเกินไปสำหรับสิ่งที่ตัวแปลงสัญญาณ Java จำนวนมากจะพิจารณาว่าตรงกับที่ยอมรับของวิธีการแก้ปัญหาเพื่อ spec !!
Dr. Rebmu

10
พิจารณากรณีที่คุณต้องการเรียงลำดับวัตถุจำนวนมาก การเรียงพวกเขา "นอกโปรแกรม" ในฐานข้อมูลเป็นทางออกที่เป็นไปได้
Viktor Seifert

40
มีนามธรรมไม่เพียงพอที่นี่ คุณต้องการอย่างน้อย 10 อินเตอร์เฟส, การใช้งาน 20 ครั้ง, การทดสอบหน่วย, การทดสอบครอบคลุม, Maven, การทดสอบการรวม, mocks ...
Naftuli Kay

6
@NaftuliTzviKay เราควรสร้าง MySQLSortEnterpriseEdition เพื่อใช้ความคิดของคุณ Victor จะยอมรับรหัสลิขสิทธิ์ GPL ที่นี่หรือไม่เพื่อให้เราสามารถเริ่มต้นใช้งานได้
Joe Z.

14
@JoeZ ใช่คำตอบของฉันขาดความคิดเห็นเกี่ยวกับรูปแบบสิทธิ์ใช้งานและฉันควรทำให้ผู้ใช้ยอมรับ EULA ในช่วงเริ่มต้นของโปรแกรม แต่เนื่องจากฉันให้ OP ขี้เกียจมันฟรีสำหรับการใช้ที่ไม่ใช่เชิงพาณิชย์รวมถึงมีประโยชน์ในการสร้าง MySQLSortEnterpriseEdidtion พรีเมี่ยมที่รอคอยมานาน
Victor Stafusa

142

C # - ไม่มีการฆ่าเหมือน overkill

ก่อนอื่นเลยที่รัก GiMmEtHaCoDeZ มาลองแยกย่อยงานของคุณ:

  1. อ่านตัวเลข
  2. เรียงพวกเขา
  3. เอาท์พุทตัวเลขเรียง

เนื่องจาก "แบ่งและพิชิต" เป็นกลยุทธ์ที่สำคัญมากเมื่อทำงานกับปัญหาซอฟต์แวร์ให้จัดการพวกเขาทีละครั้ง

1. การอ่าน

ปัญหาสำคัญอีกประการหนึ่งของซอฟต์แวร์คือความสามารถรอบตัว เนื่องจากยังไม่ได้ระบุว่าผู้ใช้จะป้อนหมายเลขได้อย่างไรซึ่งอาจเกิดขึ้นผ่านคอนโซลไฟล์ผ่านบริการบนเว็บ ฯลฯ อาจเป็นวิธีที่เราคิดไม่ถึงในตอนนี้ ดังนั้นสิ่งสำคัญคือโซลูชันของเราจะสามารถรองรับอินพุตประเภทต่างๆได้ วิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนั่นคือการแยกส่วนที่สำคัญไปยังส่วนต่อประสานสมมติว่า

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

  DoubleArrayReaderType Type {get;}
}

DoubleArrayReaderTypeการแจงนับอยู่ที่ไหน

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

สิ่งสำคัญคือการทำให้ซอฟต์แวร์สามารถทดสอบได้ตั้งแต่เริ่มต้นดังนั้นการใช้อินเทอร์เฟซจะเป็นไปได้

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

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

ต่อไปคำถามเชิงตรรกะคือวิธีที่เรารู้ว่าจะโหลดสิ่งที่เหมาะสมIDoubleArrayReaderลงในโค้ด นั่นเป็นเรื่องง่ายตราบใดที่เราใช้โรงงานที่เรียบง่าย:

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

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

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

โปรดทราบว่าเราใช้การไตร่ตรองเพื่อโหลดตัวอ่านที่ใช้งานอยู่ทั้งหมดดังนั้นส่วนขยายใด ๆ ในอนาคตจะพร้อมใช้งานโดยอัตโนมัติทันทีในเนื้อหาหลักของโค้ดที่เราเพิ่งทำ:

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

2. การประมวลผล (การเรียงลำดับ)

ตอนนี้เราต้องดำเนินการคือจัดเรียงตัวเลขที่เราได้รับ โปรดทราบว่าขั้นตอนนั้นไม่ขึ้นอยู่กับแต่ละระบบดังนั้นระบบย่อยการเรียงลำดับจึงไม่สำคัญว่าจะต้องป้อนหมายเลขอย่างไร นอกจากนี้พฤติกรรมการเรียงลำดับก็เป็นสิ่งที่อาจมีการเปลี่ยนแปลงเช่นเราอาจต้องป้อนอัลกอริทึมการเรียงลำดับที่มีประสิทธิภาพมากขึ้นแทน ดังนั้นโดยปกติเราจะแยกพฤติกรรมการประมวลผลที่ร้องขอในอินเทอร์เฟซ:

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

  DoubleArrayProcessorType Type {get;}
}

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

และพฤติกรรมการเรียงลำดับจะใช้อินเตอร์เฟส:

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

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

แน่นอนว่าเราจะต้องมีโรงงานในการโหลดและจัดการอินสแตนซ์การประมวลผล

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

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

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

}

3. การเขียนผลลัพธ์

ไม่มีอะไรจะพูดที่นี่เพราะนี่เป็นกระบวนการที่สะท้อนการป้อนข้อมูล อันที่จริงเราสามารถรวมการอ่านและการเขียนโรงงานไว้ในที่เดียวDoubleArrayInputOutputFactoryเช่นนี้

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

  DoubleArrayWriterType Type {get;}
}

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

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

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


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

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

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

  }

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

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

}

วางมันทั้งหมดเข้าด้วยกัน

ในที่สุดโปรแกรมหลักของเราจะใช้ความสุดยอดทั้งหมดนี้ที่เราได้สร้างขึ้นดังนั้นรหัสจะเป็น:

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

ที่เช่นเราสามารถกำหนดreader, writerและprocessorการใช้

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

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

14
+1 สำหรับการโอเวอร์คล็อกที่บ้าคลั่ง ผมขอแนะนำให้คุณทำลายคำตอบลงใน 3 หรือมากกว่าคำตอบ 'โมดูล' ดังนั้นเราอาจ +1 พวกเขาที
greggo

15
และเชอร์รี่ที่อยู่ด้านบนก็คือมันใช้งาน
ไลบรา

9
นั่นคือ ... สวยงาม
แอนดรู

7
การใช้ DI จะทำให้ OP สับสนเพราะนี่เป็นเพียงตัวอย่างด่วน
SWeko

132

การตีความหมายที่แท้จริงยิ่งขึ้น:

echo " aaehrrty"

นั่นคือ "อาร์เรย์" เรียงลำดับ


5
ฉันมาที่นี่เพื่อโพสต์สิ่งนี้
Quuxplusone

5
บันทึกเป็นไฟล์sort.shและเรียกเป็นsh sort.sh "an array of doubles"
Kyss Tao

ฉันคิดว่าคุณพลาด "ผู้ใช้ที่ใส่อาร์เรย์เป็นสองเท่า"
Dukeling

1
@Dukeling นั่นคือสิ่งที่ Kyss Tao แสดงความคิดเห็น "an array of doubles"สามารถส่งผ่านไปยังสคริปต์เป็นอาร์กิวเมนต์บรรทัดคำสั่ง
AJMansfield

108

Perl

จากทุกสิ่งที่ฉันทำเพื่อ CodeGolf.SE อาจใช้เวลาส่วนใหญ่อย่างน้อยสองสามชั่วโมง

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

การป้อนข้อมูลเป็นของแบบฟอร์มและการส่งออกจะอยู่ในรูป[2,4,5,7,7,3][2,3,4,5,7,7]

ฉันไม่มีเวลาอธิบายแล้ว ... กลับมาใหม่ในภายหลัง

อย่างไรก็ตามมีบางสิ่งที่เรียกว่าอาร์เรย์ที่ไม่ระบุชื่อใน Perl มันเป็นอาร์เรย์ แต่ไม่มีชื่อ อย่างไรก็ตามสิ่งที่เรารู้ก็คืออ้างอิง (ตำแหน่งหน่วยความจำ) ที่ชี้ไป ชุดตัวเลขในวงเล็บสี่เหลี่ยมสร้างอาร์เรย์ที่ไม่ระบุชื่อและส่งคืนการอ้างอิงถึงมัน

@_คำตอบนี้ถูกสร้างขึ้นออกจากชุดของอาร์เรย์ที่ไม่ระบุชื่ออ้างอิงที่ถูกเก็บไว้ใน อินพุตถูกเปลี่ยนเป็นอาร์เรย์ที่ไม่ระบุชื่อ จากนั้นเราจะสร้างอาร์เรย์ที่ไม่ระบุตัวตนอื่น ๆ ซึ่งแต่ละองค์ประกอบเป็นการอ้างอิงถึงองค์ประกอบในอาร์เรย์ก่อนหน้า แทนที่จะเรียงลำดับองค์ประกอบในอาร์เรย์เราจัดเรียงตัวชี้ไปยังองค์ประกอบในอาร์เรย์นั้น นอกจากนี้เรายังสร้างอาร์เรย์ใหม่สำหรับแต่ละขั้นตอน (และอื่น ๆ ) ในการดำเนินการเรียงลำดับ


3
ชั่วร้าย! ชั่วร้าย! ชั่วร้าย!
DGM

56
เกี่ยวกับการเป็นอ่านได้เป็นสคริปต์ Perl อื่น ๆ ให้ฉัน :)
คอเรย์โกลด์เบิร์ก

6
@swelljoe ที่จริงแล้ว$_เป็นสตริงว่าง ณ จุดนั้น ฉันเก็บผลลัพธ์ที่ต้องการใน$\ ซึ่งเป็นตัวแยกบันทึกผลลัพธ์
PhiNotPi

4
@ ง่าย ๆ "มันทำงานยังไง?"
John Dvorak

1
และตัวแปรที่ผู้ใช้สร้างขึ้นทั้งหมดมีชื่อที่น่ารักซึ่งเป็นไปตามอนุสัญญาที่สามารถคาดเดาได้ทั้งหมด
Hagen von Eitzen

80

หลาม

ให้ผู้ใช้อาร์เรย์ที่เรียงลำดับโดยการลบองค์ประกอบทั้งหมดที่ไม่เรียงตามลำดับจากอาร์เรย์อินพุต

import sys

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

อัลกอริทึมต้องผ่านรายการเพิ่มแต่ละองค์ประกอบเท่านั้นหากจะไม่ทำให้รายการไม่เรียงลำดับ ดังนั้นเอาท์พุทเป็นรายการที่เรียงลำดับ แต่ไม่ใช่รายการที่มีองค์ประกอบทั้งหมดของรายการต้นฉบับ หาก op เพียงตรวจสอบว่ารายการอยู่ในลำดับที่เรียงเขาอาจไม่สังเกตว่าเอาต์พุตเป็นค่าที่หายไป


1
โปรดดูคำตอบอื่น ๆ ก่อนโพสต์ของคุณเอง คุณควรเพิ่มชื่อภาษาของคุณ เพื่อตอบคำถามนี้คุณต้องอธิบายสั้น ๆ ว่าคุณกำลังทำอะไรเพื่อหมุนรอบ OP
Wasi

5
เฮ่อันนี้ทำให้ฉันหัวเราะออกมาดัง ๆ อย่างไรก็ตามฉันยอมรับว่าคำอธิบายที่ดีกว่านี้เล็กน้อยจะเป็นประโยชน์
oconnor0

2
การโทรซ้ำสองครั้งเพื่อsys.stdin.read()พิมพ์ผิดหรือเป็นส่วนหนึ่งของคำตอบจริง ๆ หรือไม่? แน่นอนว่ามันจะทำให้ OP ผิดหวังเพื่อให้อาร์เรย์เป็นอินพุทและรอผลต่อไป ...
Bakuriu

ว้าวนั่นมันชั่วร้ายแล้ว
Sylverdrag

13
O(n)ขั้นตอนวิธีการเรียงลำดับ ดี
ejrb

65

Bash, 54 ตัวอักษร

คำตอบจำนวนมากที่ใช้ภาษาที่ไม่มีประสิทธิภาพช้าเช่น C และ Python ... ให้เร็วขึ้นหน่อยโดยเสนอวิธีแก้ปัญหาในแม่ของภาษาสคริปต์ทั้งหมด: Bash

ฉันรู้ว่าคุณกำลังคิดอะไรอยู่ - ทุบตีไม่สามารถแม้แต่คำนวณเลขทศนิยมได้ดังนั้นมันจะเรียงลำดับได้อย่างไร? ด้วยเหตุนี้การใช้อัลกอริทึม SleepSort อันยิ่งใหญ่ของฉัน:

#!/bin/bash

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

โปรแกรมถูกจัดเตรียมพร้อมอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง วิ่งตัวอย่าง:

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

สิ่งนี้ยังมีข้อได้เปรียบของการที่สั้นที่สุดของอัลกอริทึมการทำงานทั้งหมดที่นำเสนอที่นี่ ถูกต้อง - หนึ่ง bash ที่ยิ่งใหญ่โดยใช้เพียง bash builtins และไม่เรียกไบนารีภายนอกใด ๆ (นั่นคือถ้าคุณไม่นับเอาต์พุต verbose ที่ไม่จำเป็นทั้งหมด) ซึ่งแตกต่างจาก bogosorts รันไทม์ของมันคือกำหนด

เคล็ดลับ: การเพิ่มประสิทธิภาพที่มีประสิทธิภาพคือการหารจำนวนอินพุตด้วยปัจจัยก่อนการเรียงลำดับ การใช้งานขึ้นอยู่กับผู้อ่าน

แก้ไข:

ย่อรุ่น 54-char golf ที่พิมพ์น้อยลง:

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

11
การหมุนรอบที่ 1: อัลกอริทึมใช้งานได้ แต่เห็นได้ชัดว่าอาจช้ามาก - มันจะวางไข่เธรดสำหรับแต่ละหมายเลขหลับเป็นจำนวนวินาทีนั้นก่อนที่จะส่งออกจำนวน (ซึ่งเป็นไปตามลำดับ) การหมุนรอบที่ 2: นอกจากนี้โค้ดส่วนใหญ่ใช้ในการเขียนความคิดเห็นที่ดีเกี่ยวกับจำนวนเธรดที่วางไข่และการอ่านและวิเคราะห์ข้อมูลซีพียูของระบบโดยไม่จำเป็นและไม่จำเป็น การหมุนรอบ 3: มันส่งผลให้ "เรียงลำดับอาเรย์" ในตอนท้ายซึ่งน่าจะเป็นสิ่งที่ทำ การหมุนรอบ 4: ผู้ใช้ไม่สามารถยกเลิก "การเรียงลำดับ" ได้โดยกดปุ่ม ctrl-c
Riot

4
5. มันทำงานได้เฉพาะบนGNU / Linux/proc/cpuinfoเนื่องจากการใช้งานของ
kps11346

5
วิธีแก้ปัญหาที่สร้างสรรค์มาก ๆ โดยวิธี :)
dmitry

8
มันอัศจรรย์มาก. ฉันไม่สามารถบอกได้ว่ามันยอดเยี่ยมแค่ไหน ฉันกำลังพิจารณาใช้อย่างแข็งขันเพราะทำไมไม่

4
จริง ๆ แล้วฉันมีตัวแปรนี้ในการผลิตที่ใดที่หนึ่ง แต่ในสถานการณ์ที่รันไทม์ของกระบวนการที่มีความสำคัญเพื่อให้เป็นข้อแก้ตัวของฉัน ...
ศึก

64

JavaScript มีsort()ฟังก์ชันในตัวคุณสามารถใช้งานได้เช่นนี้

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

... โอ้ทั้งหมดลืมที่จะพูดถึงมันแปลก ๆ ในการสั่งซื้อพจนานุกรมคือและ10 < 9 9 < -100อาจเป็นสิ่งที่คุณคาดหวัง


8
ดียิ่งขึ้นเพราะเป็นฟังก์ชั่นในตัว
Wayne Werner

62

(jPL) jQuery ภาษาการเขียนโปรแกรม

คุณต้องใช้ jQuery วิธีแก้ไขปัญหานี้อย่างง่าย ๆ คือวิธีต่อไปนี้:

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

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

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

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

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

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

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

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

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

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

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

jSort();


55
โดยเฉพาะอย่างยิ่งผมชอบวิธีการนี้ไม่ได้จริงใช้ jQuery
KRyan

8
-1 อาร์เรย์ของคุณตั้งชื่อต้องรวมถึงโน้ตฮังการีในนั้นโดยเฉพาะวัตถุ jQuery ความหมายโดยใช้$อาร์เรย์ใช้aและผลของการเป็นwindow.prompt p
แควนตัส 94 Heavy

2
"ส่วนที่ซับซ้อน" นั้นสง่างาม โอพีพยายามที่จะมีโครงสร้างรหัสสักวันหนึ่ง
Chris Barker

2
F'n doble "ตรวจสอบความถูกต้อง" LOOOOOOOOOOOOL ทุกวันทำแล้ว! แก้ไขสำหรับแคปน้อย
HC_

54

C

โซลูชันนี้รวมความรัดกุมและการเข้าถึงระดับ OS โดย C กับส่วนประกอบซอฟต์แวร์ที่มีประสิทธิภาพและนำกลับมาใช้ใหม่ใน GNU / Linux:

#include <stdlib.h>

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

4
หรือ #!/usr/bin/sort"สคริปต์":
หอยทากวิศวกรรม

54

ทับทิม

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

ค่อนข้างอธิบายตนเอง

หรือต้องการให้อินพุตเป็น "อาร์เรย์คู่" จริง ๆ :

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

ไม่ได้ใช้gets.chompเพื่อความชั่วร้ายเป็นพิเศษ ใช้ regex หลังจากตามมาเรื่อย ๆ ซึ่งเป็นสิ่งที่ฉันไม่รู้ด้วยซ้ำว่าคุณทำได้ (ขอบคุณ Jan Dvorak) เพื่อทำให้ OP สับสนมากขึ้น!


4
an array of doublesขยายตัวในความคิดผมซ้ำแล้วซ้ำอีกจะถามสำหรับการป้อนข้อมูลจนกว่าผู้ใช้ปัจจัยการผลิตสตริง
Wrzlprmft

@Wrz ตกลงเสร็จแล้ว :-)
Doorknob

2
มันยอดเยี่ยมมากเพราะ OP ที่น่าสงสารจะต้องหาวิธีกำจัด newline (เพราะคุณใช้getsแทนgets.chomp)
wchargin

@WChargin ใช่ฉันมีสิ่งนั้นในการแก้ไขครั้งแรก (ดูประวัติการแก้ไข) แต่ลบมันออกให้เป็นสิ่งที่เลวร้ายยิ่งกว่า>: D แก้ไข: โอ้เดี๋ยวก่อนไม่เป็นไรนั่นเป็นคำตอบอื่นของฉัน ฉันจะแก้ไขอันนี้ :-)
Doorknob

1
+1 ฉันสร้างบัญชีที่นี่เพื่อบอกว่านี่คือสิ่งที่ฉันจะตอบมัน! รักมัน!
DGM

44

Python3.3

แน่นอนว่านี่คือโปรแกรม Python ที่ง่ายที่สุดที่สามารถเรียงลำดับอาร์เรย์ที่กำหนดให้เป็นรายการตามตัวอักษรบน stdin:

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

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



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

น่าเสียดายที่มันใช้งานได้ใน python3.3 + เท่านั้นเนื่องจากใช้yield fromนิพจน์ รหัสควรอธิบายได้ด้วยตนเองดังนั้นคุณไม่ควรมีปัญหาใด ๆ เมื่อส่งมอบให้อาจารย์ของคุณ


การหมุนรอบอยู่ในการให้บริการโซลูชั่นการทำงานอย่างสมบูรณ์แบบที่ทำตามที่ OP ต้องการ แต่ในลักษณะที่:

  • เป็นไปไม่ได้ที่จะเข้าใจ (โดยผู้เริ่มต้น)
  • เป็นไปไม่ได้ที่จะจัดการกับครูเพราะ:
    • OP ไม่สามารถเข้าใจได้
    • แม้ว่าเขาจะทำได้ครูก็ไม่มีเวลาถอดรหัสเพื่อที่จะเข้าใจ
  • น่ากลัวสำหรับมือใหม่ที่ไร้เดียงสาซึ่งอาจคิดว่าการเขียนโปรแกรมนั้นยากเกินไปสำหรับเขา

โดยสรุปคำตอบนี้จะเพิ่มความยุ่งยากในการล้อเลียนคำขอของนักเรียนด้วยคำตอบที่ถูกต้องสมบูรณ์แบบจากมุมมองที่กำหนด


(อย่าอ่านถ้าคุณพิจารณาความท้าทายในการทำความเข้าใจโค้ดด้านบน)

ฉันต้องเพิ่มว่าการหมุนรอบจะเพิ่มขึ้นด้วยความจริงที่ว่าอัลกอริทึมการเรียงลำดับที่ใช้นั้นเป็นจริง

ฟองเรียงลำดับ! ... ซึ่งสามารถนำไปปฏิบัติในทางที่แม้แต่ OP เข้าใจได้ มันไม่ใช่อัลกอริธึมที่คลุมเครือ แต่เป็นเพียงโค้ดที่ดีสำหรับบางสิ่งที่ OP สามารถเข้าใจได้อย่างสมบูรณ์


3
ฉันคิดว่านี่อาจใช้คำอธิบายเพิ่มเติม สิ่งที่คุณทำกับนรกตอนนี้หรือไม่
KRyan

1
ว้าวคุณสามารถทำชื่อตัวแปรที่ไม่ใช่ ascii ในไพ ธ อนได้ไหม? ไม่ทราบ ...
kratenko

1
@kratenko จาก python3 + ใน python2 ล่ามถือว่า ASCII เป็นการเข้ารหัสและอาจทำให้เกิดข้อผิดพลาด ใน python3 ล่ามถือว่า UTF-8 เป็นการเข้ารหัสและยอมรับอักขระทั้งหมดที่เป็น "ตัวอักษร" โดยคุณสมบัติ Unicode สำหรับตัวระบุ
Bakuriu

3
@KRyan: เห็นได้ชัดว่าเขาใช้วิธีการเรียงลำดับที่ Hell ใช้เพื่อให้ผู้คนเข้าสู่วงการทั้งเก้า
Joe Z.

10
โอ้พระเจ้าของฉัน ... +1 สำหรับè
ฌอน Allred

41

C - ช้าใช้ยากสไตล์การเข้ารหัสที่ยอมรับไม่ได้

ขั้นตอนวิธีการเรียงลำดับตัวเองเป็นที่รู้จักกัน slowsort และมีความซับซ้อนกรณีที่ดีที่สุด (Simplexity) ประมาณn ^ (log n / 2) อัลกอริทึมนี้ได้รับการเผยแพร่โดย Andrei Broder และ Jorge Stolfi ในบทความที่ยอดเยี่ยมของพวกเขา"Pessimal Algorithms และ 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 ก็โอเค)
  • arithmetics ของพอยน์เตอร์และไม่ต้องกังวลกับประเภทของมัน

สิ่งนี้มีพฤติกรรมที่ไม่ได้กำหนดสำหรับอินพุตทั้งหมดที่มากกว่า 7 ไบต์ ไม่ใช่คำตอบที่ยอมรับได้
Michael Spencer

1
ชอบกระดาษ "Pessimal Algorithms" ขอบคุณ
Ryan

“ อัลกอริทึมการเรียงลำดับที่ช้าที่สุดที่ฉันรู้จัก” - อัลกอริทึมการเรียงลำดับที่ช้าที่สุดที่พิสูจน์ได้ นั่นคือจุดทั้งหมดของกระดาษ AFAIR
Konrad Rudolph

@MichaelSpencer สนใจที่จะทำอย่างละเอียด? ฉันยกตัวอย่างขนาดอินพุต 24 ไบต์และผลลัพธ์เป็นสิ่งที่เราคาดหวัง (ฉันคิดว่าฉันอาจพลาดเรื่องตลกที่นี่)
shiona

2
@Sasho แต่ bogo-sort มีเวลาทำงานที่ดีที่สุดของ \ Omega (n) (n-1 การเปรียบเทียบ, 0 การดำเนินการ) เร็วกว่านั้นมาก แย่กว่า \ Omega (n ^ (บันทึก n / 2))
shiona

39

Ruby, 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

@Wchargin ฉันอาจพิจารณา :-) คุณอาจสนใจในการแก้ไขล่าสุดของฉัน! (ขออภัยที่ช้าฉันจริง ๆ แล้วฉันใช้มือถือของฉันตอนนี้เนื่องจากฉันไม่สามารถเข้าถึงคอมพิวเตอร์ :-P)
Doorknob

37

ภาษาโคบอล

แน่นอน! "แม้แต่ลิงก็สามารถทำได้!"

นี่คือโปรแกรมภาษาโคบอลง่าย ๆที่จะเรียงลำดับอินพุตสำหรับคุณ อ่านความคิดเห็นเพื่อดูว่ามันเป็นเรื่องเล็กน้อยและยืดขยายได้อย่างไร ประโยชน์ที่แท้จริงของสิ่งนี้คือมันได้รับการทดลองและกลไกที่แท้จริงมันไม่ได้พึ่งพาภาษาใหม่และยังไม่ทดลองเช่นจาวาและทุกอย่างที่ใช้บนเว็บหรือจาก Microsoft มันรวบรวมได้อย่างมีประสิทธิภาพจริงๆและขั้นตอนเช่นนี้ถูกใช้โดย บริษัท ทางการเงินที่ประสบความสำเร็จมากที่สุดใน Fortune500 และผู้นำอุตสาหกรรมอื่น ๆ รหัสนี้ได้รับการตรวจสอบโดยผู้เชี่ยวชาญจำนวนมากและได้รับการยอมรับว่าเป็นกลไกที่ยอดเยี่ยมสำหรับการเรียงลำดับ

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

6
มีเพียงคุณเท่านั้นที่จะใช้ภาษาโคบอลสำหรับคำตอบสำหรับคำถามนี้ +1
syb0rg

5
Ah, กลิ่นสดของบัตรเจาะ
Sklivvz

3
@EbenezerSklivvze - LOL ฉันเคยเอาการ์ดเจาะที่ฉันใช้เป็นที่คั่นหนังสือเมื่ออาจารย์วิทยาลัยการประชุมของฉันบอกชั้นเรียนเกี่ยวกับบัตรตอกที่เก่าแก่ เขาปูพื้นอย่างพอเพียง (ในปี 1994 :) อย่าคิดว่าหลายรุ่นของฉันเคยเห็นดาดฟ้าทั้งหมด ...
DVK

30

OP ไม่เคยพูดว่าจะเรียงลำดับอย่างไร ... หรือคำจำกัดความของคู่คืออะไร สมมติว่าประเภทข้อมูลdoubleแต่ตีความว่ามันเป็นรายการที่ซ้ำกัน ใช้ JavaScript ที่นี่

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

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

ผลลัพธ์: ลำดับที่สลับกัน [4, 11, 4, 9, 5, 7, 6, 7]


4
msgstr "สมมติว่าประเภทข้อมูลเป็นสองเท่า แต่ตีความว่าเป็นข้อมูลซ้ำ" อัจฉริยะที่แท้จริงเท่านั้นที่จะคิดแบบนั้น ยอดเยี่ยมเพียง!
เฟลิเป้มิโอโซ

@FelipeMiosso พูดตามตรงฉันไม่แน่ใจว่าคุณเป็นคนที่เหน็บแนม ...
Kiruse

1
ฮ่าฮ่า ... ข้าประชดประชันแล้ว ฉันรู้ว่ามีผู้คนจำนวนมากที่คิดอย่างนั้น อย่างไรก็ตาม ... คำตอบของคุณช่างยอดเยี่ยม! ฉันหัวเราะมาก
Felipe Miosso

@FelipeMiosso ดีใจที่ได้ช่วยหัวเราะ ;)
Kiruse

console.log ทุกอย่าง!
Emil Vikström

28

PHP

นี่คือการดำเนินการเต็มรูปแบบด้วยการจัดการข้อผิดพลาด มันเป็นวิธีที่เร็วที่สุดสำหรับทุกarray of doublesคน

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

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

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

การเปลี่ยนแปลงครั้งต่อไปใน C ++ จะทำงานโดยการคืนค่าเป็นจริงเมื่ออาเรย์ถูกจัดเรียงและเป็นเท็จมิฉะนั้น (หลังจากที่อนุญาต) ดังนั้นคุณควรจัดเรียงอาร์เรย์แล้วใช้มันในสิ่งที่ต้องทำในขณะที่ด้านบน (ดังนั้นมันจะทำให้วงกลมเต็มกลับไปยังอาร์เรย์ที่เรียงลำดับ)


+1 ฉันคิดว่าจะใช้next_permutationสำหรับคำตอบของฉัน แต่มันดีกว่าที่ฉันคิดไว้
jliv902

25

[แก้ปัญหาด้วยการชี้ทางผิด ๆ อย่างพิถีพิถัน]

โปรดอ่านมาตรฐานที่เกี่ยวข้อง IEC 60559: 1989 ข้อมูลจำเพาะสำหรับการคำนวณจุดลอยไบนารีสำหรับระบบไมโครโปรเซสเซอร์ซึ่งคุณสามารถซื้อที่นี่ ในเชิงอรรถถึง .105.10 รายละเอียดของคำสั่งทั้งหมดคำสั่งจะถูกบันทึกไว้ว่า:

ผลรวมคำสั่งไม่ได้รวมการสั่งซื้อทั้งหมดในการเข้ารหัสทั้งหมดในรูปแบบ โดยเฉพาะอย่างยิ่งมันไม่ได้แยกความแตกต่างระหว่างการเข้ารหัสที่แตกต่างกันของการเป็นตัวแทนจุดลอยตัวเดียวกันเช่นเมื่อการเข้ารหัสหนึ่งหรือทั้งสองไม่ใช่แบบบัญญัติ

ดังนั้นเราจึงเห็นว่ามันเป็นไปไม่ได้ที่จะเขียนโค้ดเพื่อจัดเรียงคู่ มันเป็นคำถามที่หลอกลวง ฮ่าฮ่าฉลาดมาก! โปรดบอกอาจารย์ของคุณว่าฉันสนุกกับหลักสูตรของเขามาก

[แก้ไข: ไม่มีอะไรต้องให้ฉันไม่คิดว่าปัญหาต้องการคำสั่งทั้งหมด]


3
แต่ปัญหาคือการเรียงลำดับคู่ ไม่มีใครต้องการค่าที่จะอยู่ในลำดับ (รวม) ตัวอย่างเช่นคุณสามารถเรียงลำดับอาเรย์เป็นสองจำนวนบวกและลบ คุณถูกคำถามสองครั้ง
shiona

23

จาวาสคริปต์ที่ชั่วร้าย:

โอพีฉันไม่ต้องการให้ทุกสิ่งกับคุณดังนั้นฉันจะให้คุณทราบวิธีรับข้อมูลจากผู้ใช้ด้วยตัวคุณเอง (คำใบ้: ใช้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=-.8และincrement=.1) โปรแกรมจะทำงานตลอดไป ในหมายเหตุที่เกี่ยวข้องปัจจุบันฉันเป็นเจ้าของภูมิใจในแท็บเบราว์เซอร์ที่ไม่ทำงาน 2 อันเนื่องจากปัญหานี้ :)

หมายเหตุ II: ฉันรู้สึกน่าขยะแขยงแม้จะเขียนโค้ดด้านบน

หมายเหตุ III: MWA HAHAHAHA!


ความคิดดี. คุณต้องเท่ห์เมื่อคุณยังเป็นนักเขียนโปรแกรมมือใหม่
Pierre Arlaud

22

นี่คือคำตอบที่แท้จริงที่ฉันชอบสำหรับ Java:

เพิ่ม Line ก่อน println และ array ของคุณจะถูกเรียงลำดับ

Arrays.sort( array );

ไม่มีคำอธิบายสับสน OPแต่ทำงานได้และจะได้รับ upvotes จากโปรแกรมเมอร์ที่มีประสบการณ์มากขึ้น


อีกคำตอบที่คล้ายกัน :

ดูที่Arrays.sort ()

บอกผู้ปฏิบัติการให้ทำวิจัยของตนเองโดยอ้อมในขณะที่ให้คำตอบที่ถูกต้องคลุมเครือ หากไม่มีการวิจัยเพิ่มเติมOP ยังสับสนอยู่ ฉันก็ชอบที่ลิงค์ชี้ไปที่เอกสารเก่า


10
สิ่งนี้มีประโยชน์และสมควรแก่การลงคะแนนเสียง
emory

11
"บอก OP โดยตรงให้ทำวิจัยของเขาเองในขณะที่ให้คำตอบที่ถูกต้องคลุมเครือ" สวยมากอธิบายสไตล์ของฉันของ StackOverflow ตอบ: /
Corey Goldberg

7
"ลองดูที่ Arrays.sort ()" ... "ฉันขอตัวอย่างวิธีใช้ในโปรแกรมได้ไหม?" ... ยอดเยี่ยม
SimonT

5
+1 โดยเฉพาะอย่างยิ่งเนื่องจาก OP ผู้ถ่อมตนของเราอาจต้องเขียนเรียงลำดับตัวเองสำหรับชั้นเรียนทำให้ Array.sort () ไร้ประโยชน์อย่างสมบูรณ์กับเขา / เธอ
เควิน

2
Ctrl + F -> "ฉันขอตัวอย่างวิธีใช้ในโปรแกรมได้ไหม" = 3 ผลลัพธ์
Qix

21

ขั้นตอนวิธีเชิงพันธุกรรม / วิธีมอนติคาร์โลสำหรับปัญหาการเรียงลำดับใน JAVA

ปัญหาการเรียงลำดับเป็นที่รู้กันว่าวิทยาศาสตร์คอมพิวเตอร์เป็นเวลานานและพบวิธีแก้ปัญหาที่ดีมากมาย ในปีที่ผ่านมามีความก้าวหน้าอย่างมากในการคำนวณทางชีวภาพและการดูว่าชีววิทยาช่วยแก้ปัญหาได้อย่างไรแสดงให้เห็นว่ามีความช่วยเหลือที่ดีในการแก้ปัญหาอย่างหนัก อัลกอริทึมการเรียงลำดับนี้ใช้แนวคิดที่ดีที่สุดเหล่านี้เพื่อใช้ในการแก้ปัญหาการเรียงลำดับ ความคิดนั้นค่อนข้างง่าย คุณเริ่มต้นด้วยอาเรย์ที่ไม่ได้เรียงลำดับและหาวิธีเรียงลำดับนี้แล้ว คุณให้คะแนนกับ "sortness" ของมันจากนั้นทำการเรียงลำดับอาร์เรย์ด้วยองค์ประกอบแบบสุ่ม - เช่นเดียวกับชีววิทยาที่ไม่ชัดเจนว่าเด็ก ๆ จะมีหน้าตาเป็นอย่างไรแม้ว่าคุณจะรู้ทั้งหมดเกี่ยวกับพ่อแม่! นี่คือส่วนของอัลกอริทึมทางพันธุกรรม คุณสร้างลูกหลานของอาเรย์นั้นเพื่อที่จะพูด ถ้าอย่างนั้นคุณจะเห็นว่าลูกหลานนั้นดีกว่าผู้ปกครองหรือไม่ หากเป็นกรณีนี้คุณจะต้องใช้อาร์เรย์ใหม่นี้เป็นจุดเริ่มต้นในการสร้างการเรียงลำดับต่อไปเรื่อย ๆ จนกว่าอาร์เรย์จะถูกเรียงลำดับอย่างสมบูรณ์ สิ่งที่ยอดเยี่ยมเกี่ยวกับวิธีนี้คือมันใช้เวลาสั้นลงถ้าอาร์เรย์เรียงลำดับจากจุดเริ่มต้นไปเล็กน้อยแล้ว

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 ในทางที่ผิด
  • การตั้งชื่อตัวแปรไม่สอดคล้องและไม่ดี
  • พล่าม blah blah เกี่ยวกับ biocomputing
  • ภาษาที่ประดิษฐ์และไม่สอดคล้องกันในคำอธิบาย
  • มอนเต้คาร์โลเป็นเครื่องมือที่ไม่ถูกต้องสำหรับปัญหาที่กำหนดล่วงหน้า
  • การนำเข้าที่ไม่จำเป็น
  • อาจจะมีสารพัดมากกว่า ...

กำลังเรียก GA นี้หรือ Monte Carlo อีกระดับของการหมุนรอบ ฉันเชื่อว่านี่เป็นอัลกอริธึมการปีนเขาแบบสุ่ม
shiona

การเชื่อมโยงโปรแกรมนี้กับชื่อ buzzword เป็นความตั้งใจ แต่ฉันไม่เคยได้ยิน "อัลกอริธึมการปีนเขาแบบสุ่ม" อย่างใดอย่างหนึ่ง ... และในแง่ที่กว้างกว่าฉันคิดว่า 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 THตำแหน่งทศนิยม


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
“ อัลกอริทึม” ของคุณมีน้ำตา
เนท

ฮะนั่นไม่ได้เป็นอัลกอริทึมเพราะมันไม่ได้รับอนุญาตให้เสร็จ>> D
jmacedo

@ joxnas จริง ๆ แล้วบนระบบที่ไม่มีอุปกรณ์สุ่มที่ไม่ได้กำหนดค่าไว้ตัวสุ่มอาจเป็นระยะ จากนั้นมันก็จะขึ้นอยู่กับว่าชุดของการเรียงสับเปลี่ยนที่เป็นไปได้ที่อนุญาตโดยตัวสุ่มนั้นจะเป็นชุดของการเรียงสับเปลี่ยนที่เป็นไปได้ $ S_n $ สำหรับอินพุตอาร์เรย์ที่เป็นไปได้ทั้งหมดมีความยาว $ n $ หรือไม่
ข้อผิดพลาด

อ๊ะกางเกงฉันลืม LaTeX รองรับเฉพาะใน TeX.SE และ Math.SE ลองนึกภาพสัญลักษณ์เหล่านั้นด้วย itootix
ข้อผิดพลาด

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 Intelligent Design Sort

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

6
เครดิตที่เครดิตครบกำหนด: dangermouse.net/esoteric/intelligentdesignsort.html
wchargin

1
ไม่เข้าใจว่าทำไมคุณถึงทุบตีการออกแบบอย่างชาญฉลาดในการประกวดการเขียนโปรแกรม?
khebbie

12
@khebbie ทำไมล่ะ
Konrad Rudolph

ปัญหาคือหากผู้ใช้เป็นคนป้อนตัวเลขแล้วพวกเขาก็จะฉลาดกว่าตัวเอง ;)
d -_- b

16

Python - req # 1

รหัสนี้จะเรียงลำดับคู่ในลำดับคำศัพท์มากกว่าการเพิ่มลำดับตัวเลขโดยการสร้างแผนภูมิคำนำหน้าของตัวเลขแล้ววนซ้ำตามลำดับซ้ำ

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

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

def pcg_sort(arr):
    root = trie_node()

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

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

    return fsarr

input_array = []

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

มันทำงานได้n log nทันเวลาและในความเป็นจริงแล้วเป็นวิธีที่ชาญฉลาดในการเก็บรายการที่เรียงไว้เป็นอย่างอื่น แต่น่าเสียดายที่สำหรับ 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 ฉันคิดว่ามันจะดีกว่าถ้าความเห็นเพื่อทำให้การหารดูน่าเชื่อถือ ในรีโบล ...

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

การปิดความคิดที่ว่าพวกเขาไม่รู้จริง ๆ ว่า double นั้นคืออะไรและอาจเชื่อว่า list ของ double เป็นแค่ตัวเลขจำนวนมากคูณด้วยสอง


6
บางทีพวกเขาอาจจะต้องลดลงครึ่งหนึ่งเนื่องจากมีการป้อนข้อมูลเป็นสองเท่า!
kealist

@kealist ฉันคิดว่าอย่างไรก็ตามเรื่องนี้เล่นกับความคิดที่ว่า "การเสแสร้ง" เกิดขึ้น ฉันคิดว่ามันน่าจะดีกว่านิดหน่อยถ้ามี [2 * num]
ดร. Rebmu

10

จงใจเข้าใจผิดคำถาม:

ใช้วิธีเรียกซ้ำ:

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

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

อาเรย์ที่เรียงนั้นรับประกันว่าจะส่งออกได้ในบางจุดสำหรับข้อมูลทุกประเภทในอาเรย์แม้กระทั่งลำดับการเรียงลำดับใด ๆ และแม้แต่ตัวคั่นชนิดใดก็ได้สำหรับอินพุตซึ่งทำให้วิธีนี้มีความยืดหยุ่นอย่างมาก ข้อเสียเปรียบหลักของมันคือมันช้าไปหน่อยสำหรับอาร์เรย์ขนาดใหญ่ แต่คุณสามารถแก้ปัญหานั้นได้อย่างง่ายดายด้วยการใช้มัลติเธรด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.