Kullanıcının bir çiftler dizisi girdiği ve programın dizilmiş diziyi çıkardığı bir programa ihtiyacım var


280

Not: Bu soru ilk gönderdiğimden beri ciddi bir şekilde düzenlendi. Kurallar buraya taşındı , bunun amacını anlamak için herhangi bir cevap göndermeden önce bunları okuyun. Bu kategorisinde oluşturulan ilk soruydu .

Stack Overflow'ta tembel bir kullanıcı olduğunu düşünün ve bu soruyu sorar:

Kullanıcının bir çiftler dizisi girdiği ve programın dizilmiş diziyi çıkardığı bir programa ihtiyacım var. Lütfen kodu verebilir misiniz?

Bu kullanıcıyı yönlendiren bir kod parçasını nasıl oluşturabilirsiniz? Deneyimsiz bir programcı için kullanışlı görünecek ancak pratikte tamamen yararsız bir kod parçası oluşturun.

Kazanan, en fazla oy alan cevaptır, ancak cevap bir şekilde uygun değilse (uygunluk gereklilikleri için, etiketinin wiki etiketini kontrol edin ). Önceden en çok oylanan cevap, kabul edildikten sonra alınan oy sayısında gelecekte dövülürse, en iyi yeni cevap kabul edilir ve bir önceki yanıt kabul edilmez. Beraberlik durumunda, kazananı bağlı olanlar arasında istediği gibi seçeceğim ya da sadece biraz daha bekleyeceğim.

Kod içermeyen cevaplar uygun değildir. Eğlenceli olabilirler ve biraz puan alabilirler, ancak kabul edilmeyeceklerdir.

Kurallar etiket açıklamasında bulunabilir .

Not: Bu bir sorusudur. Lütfen soruyu ve / veya cevapları ciddiye almayın. Daha fazla bilgi burada .



6
@bluesm Birisi, bir başkasının, kendi zamanını öğrenmesini boşa harcamak yerine, kendi sorununu çözmesini istemeye karar vermişse, kendi başlarına öğrenebilecekleri bir bağlantıyı göndermenin hiçbir yararı olmaz.
IQAndreas,

3
Vay canına, bu soru 24 saatten az bir sürede 100 indirim ve 10.000 görüşme elde etmek üzere!
Joe Z.

18
Aman Tanrım, Victor, Hakkında kutun çok üzücü ... hepimizin iniş ve çıkışları var ama kendini yenmemelisin. Artık her yerde Code Golfers için bir kahramansın!
SimonT

4
Hiç kimse dayalı bir çözüm getirmiştir şaşırdım sıralama uyku henüz
Frank Farmer

Yanıtlar:


178

Bazen buradaki topluluk ev ödevlerinde yardımcı olmayı sevmez. Bu yüzden bu kadar çok şaka cevabı alıyorsunuz. Ama yardım etmeyi severim. İşte 'C' de tam bir çözüm (Java veya Ruby ile "betik" değil "programlama" öğrenmek istediğinizi varsaydığımdan beri). İlk öğrenim sırasında bilmesini istediğim birçok ipucu ekledim

#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
Neredeyse tüm tavsiyeler yanlıştır ve girilen listeyi girene kadar sadece giriş listesini sorar.
Ashelly

47
+1, kullanıcı için 1st, 2th, 3th, 4th...ve operatöre göre - çok gelişmiş C programlama teknikleri.
Kaya

5
Kullanmalı sscanf(input, "%5s", &input[0]), aksi takdirde girişi ayrıştırırken taşma hataları olabilir. Ve char input[sizeof(int)+1]64 bit sistemlerle geriye dönük uyumluluk için girdi bildirilmelidir .
sh1,

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

15
Java'da çöp toplama var. Bu yüzden Java, "programlama" dır, gerçek programlama değil. Bu temel CS101. (yani trol diyor.)
AShelly

181

İşte java'da. Bir MySQL veritabanı oluşturduğu için, kesinlikle aldatılmaz, kabul edilemez ve düzeltilemez, numarayı buraya yerleştirin, bir ORDER BY deyimi ile seçim yapın ve MySQL tarafından verilen sayıları çıkarır. Aslında, sıralama yapan programdır, MySQL'dir.

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
Bu aslında birçok Java kodlayıcısının spec için kabul edilebilir bir çözüm eşleşmesi olacağını düşündüğü için eve çok yakın!
Doktor Rebmu

10
Ayrıca çok sayıda nesneyi sıralamanız gereken durumu düşünün. Bunları "programın dışında" bir veritabanında sıralamak uygun bir çözümdür.
Viktor Seifert

40
Burada yeterli soyutlama yok. En az 10 arayüze, 20 uygulamaya, numaralamaya, ünite testlerine, kapsam testlerine,
Maven'e

6
@NaftuliTzviKay Fikrinizi uygulamak için bir MySQLSortEnterpriseEdition yaratmalıyız. Victor, burada başlayabilmemiz için buradaki kodu GPL lisansı vermeyi kabul edecek mi?
Joe Z.

14
@JoeZ. Evet, cevabım lisans modeliyle ilgili yorumlardan yoksundur ve kullanıcının programın başlangıcında bir EULA almasını sağlamalıyım. Ancak tembel OP’e verdiğimden beri, uzun zamandır beklenen premium MySQLSortEnterpriseEdidtion premiumunu oluşturmakta fayda sağlamak da dahil olmak üzere ticari olmayan kullanım için ücretsizdir.
Victor Stafusa,

142

Overkill gibi öldürmek yok

Öncelikle, sevgili GiMmEtHaCoDeZ, görevinizi parçalamaya çalışalım:

  1. Numaraları oku
  2. Onları sırala
  3. Sıralanan sayıların çıktısını alın.

“Böl ve ele geçir” yazılım problemleriyle çalışırken çok önemli bir strateji olduğundan, her seferinde bunlarla başa çıkabilmenizi sağlar

1. Okuma

Yazılımdaki bir diğer önemli konu çok yönlülüktür. Kullanıcının, konsoldan, bir dosyadan, bir web servisinden, vb. Sayıları nasıl gireceği belirtilmediğinden, belki de şu anda düşünemediğimiz bir yöntem bile olabilir. Bu nedenle, çözümümüzün çeşitli girdi türlerini barındırabilmesi önemlidir. Bunu başarmanın en kolay yolu, önemli kısmı bir arayüze çıkarmak olacaktır.

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

  DoubleArrayReaderType Type {get;}
}

DoubleArrayReaderTypeile verilen bir numara nerede

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

Yazılımın sıfırdan test edilebilir hale getirilmesi de önemlidir, bu nedenle arabirimin bir uygulaması olacaktır.

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

Daha sonra, mantıksal soru, uygun IDoubleArrayReaderkodu koda yüklemeyi nasıl bileceğimizdir . Basit bir fabrika kullandığımız sürece kolay.

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

Tüm aktif okuyucuları yüklemek için yansıma kullandığımızı unutmayın, bu nedenle gelecekteki uzantılar otomatik olarak kullanıma sunulacaktır.

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

2. İşleme (sıralama)

Şimdi işlem yapmamız gerekiyor, yani edindiğimiz sayıları sıralayın. Adımların birbirinden tamamen bağımsız olduğuna dikkat edin, bu nedenle sıralama alt sistemine, sayıların nasıl girildiği önemli değildir. Ek olarak, sıralama davranışı aynı zamanda değişime tabi olan bir şeydir, örneğin yerine daha verimli bir sıralama algoritması girmemiz gerekebilir. Doğal olarak, istenen işleme davranışını bir arayüzde çıkaracağız:

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

  DoubleArrayProcessorType Type {get;}
}

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

Ve sıralama davranışı sadece arayüzü uygulayacaktır:

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

Tabii ki, işleme örneklerini yüklemek ve yönetmek için bir fabrikaya ihtiyacımız olacak.

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. Çıktıyı yazmak

Burada söylenecek fazla bir şey yok, çünkü bu girdiyi yansıtan bir süreç. Aslında, okuma ve yazma fabrikalarını tek bir üründe birleştirebilirdik, DoubleArrayInputOutputFactoryşöyle:

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

}

Hepsini bir araya koy

Sonunda, ana programımız zaten kurduğumuz tüm bu uygunsuzlukları kullanacak, bu yüzden kod şu şekilde olacaktır:

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

nerede, örneğin biz tanımlayabiliriz reader, writerve processorkullanma

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

49
Lol, ListSort Enterprise Sürümü © :-P + 1
Kapı Düğmesi

14
Çılgın kodlama için +1. Cevabınızı 3 veya daha fazla 'modül' cevabına bölmenizi öneriyorum, böylece onları tek tek + 1'leyebiliyorum
greggo

15
Ve üstüne kiraz aslında bir kütüphane sıralaması kullanıyor :) :) Tamamen spec ve tamamen işe yaramaz
SWeko

9
Bu ... güzeldi.
Andrew,

7
DI'yi kullanmak OP'yi şaşırtmaz, çünkü bu sadece hızlı bir örnek.
SWeko,

132

Daha da fazla edebi yorum:

echo " aaehrrty"

yani, "dizi" sıralanır.


5
Buraya yazı göndermeye geldim.
Quuxplusone

5
dosya olarak kaydet sort.shve arash sort.sh "an array of doubles"
Kyss Tao

Bence "kullanıcı iki katına çıkarılmış bir diziyi girdi".
Ocak'ta Dukeling 23

1
@Dukeling, Kyss Tao'nun yorum yaptığı nokta. "an array of doubles"komut dosyasına bir komut satırı argümanı olarak iletilebilir.
AJMansfield

108

Perl

CodeGolf.SE için yaptığım her şeyden, bu muhtemelen en çok zaman aldı, en az birkaç saat.

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

Giriş formda [2,4,5,7,7,3]ve çıkış formda [2,3,4,5,7,7].

Şimdi açıklamak için zamanım yok, sonra döneceğim.

Her neyse, Perl'de isimsiz bir dizi adı verilen bir şey var. Bu bir dizi, ama adı yok. Ancak, bildiğimiz şey, onu işaret eden bir referans (hafıza yeri). Köşeli parantez içindeki bir sayı dizisi anonim bir dizi oluşturur ve ona bir başvuru döndürür.

Bu cevap, referansların içinde bulunduğu bir dizi anonim diziden oluşur @_. Giriş anonim bir diziye dönüştürülür. Daha sonra, her biri önceki dizideki bir öğeye başvuru yapan başka anonim diziler oluşturuyoruz. Dizideki öğeleri sıralamak yerine, işaretçileri bu dizideki öğelere göre sıralarız. Ayrıca, sıralama işlemindeki her adım (ve daha fazlası) için yeni bir dizi oluştururuz.


3
kötülük! kötülük! kötülük!
DGM,

56
Bana başka bir Perl betiği kadar deşifre edilebilir :) :)
Corey Goldberg

6
@swelljoe Aslında, $_bu noktada boş bir dizedir. İstediğim çıktıyı $\ , çıktı kayıt ayırıcısı olan içinde sakladım.
PhiNotPi,

4
@Andy basit. "O nasıl çalışır?"
John Dvorak

1
ve kullanıcı tarafından yaratılan tüm değişkenler, tüm düşünülebilen sözleşmeleri izleyen hoş adlara sahiptir
Hagen von Eitzen

80

piton

Girilen dizideki sıralı olmayan tüm öğeleri kaldırarak kullanıcıya sıralı bir dizi verir.

import sys

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

Algoritma, listeyi yalnızca sıralanmamış yapmazsa, her bir öğeyi ekleyerek listeye girer. Bu nedenle çıktı, orijinal listenin tüm öğelerini içeren bir liste değildir. Op listenin sıralı sırada olup olmadığını kontrol ederse, çıktının eksik olduğunu fark etmeyebilir.


1
Lütfen kendi mesajınızı göndermeden önce diğer cevaplara bakınız. Dilinizin adını eklemelisiniz. Bu soruyu cevaplamak için ayrıca OP'de yer almak için ne yaptığınızı kısaca açıklamanız gerekir.
Wasi

5
Hehe, bu beni gerçekten çok güldürdü. Her neyse, biraz daha iyi bir açıklamanın yararlı olacağı konusunda hemfikirim.
oconnor0

2
İkili çağrı sys.stdin.read()bir yazım hatası mı yoksa gerçek trolling yanıtının bir parçası mı? Elbette, diziyi girdi olarak vermek ve sonuç için beklemeye devam etmek
OP'yi bozacaktır

Vay, bu kötü.
Sylverdrag

13
Bir O(n)sıralama algoritması. Güzel.
ejrb

65

Bash, 54 karakter

C ve Python gibi yavaş verimsiz dilleri kullanan bir sürü cevap ... tüm betik dillerinin annesine bir çözüm sunarak işleri biraz hızlandıralım: Bash.

Ne düşündüğünü biliyorum - Bash kayan nokta aritmetiğiyle bile baş edemiyor, peki nasıl sıralayacak? Şey, işte, güçlü SleepSort algoritmasını uygulamam:

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

Program komut satırı argümanları olarak girdi ile sağlanmıştır. Örnek çalışma:

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

Bu aynı zamanda, burada sunulan tüm çalışma algoritmalarının en kısa olması avantajına da sahiptir. Bu doğru - güçlü bir bash satırı, yalnızca bash yerleşiklerini kullanarak ve herhangi bir harici ikili dosya çağırmıyor (yani, tamamen isteğe bağlı ayrıntılı çıktıyı saymazsanız). Desteklemelerin aksine, çalışma zamanı belirleyicidir.

İpucu: Etkili bir optimizasyon, giriş numaralarını sıralamadan önce bir faktöre bölmektir. Uygulama okuyucuya bırakılmıştır.

Düzenle:

Daha az hoş baskı ile kısaltılmış 54 char golf versiyonu:

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

11
Trolling 1: Algoritma işe yarıyor ancak açık bir şekilde potansiyel olarak son derece yavaş - her sayı için bir iplik oluşturuyor, sayıyı vermeden önce bu sayı için uyuyor (bu nedenle sırayla). Trolling 2: Ayrıca, kodun çoğu, yumurtlamanın kaç ipliği olduğu hakkında güzel bir yorum yazmak için harcanır ve gereksiz ve gizlice, sistemin bazı cpu bilgilerini sadece fazladan bir çıktının çıkması uğruna okur ve ayrıştırır. Trolling 3: Sonunda "sıralanan" dizgiyi çıktılar, ki bu bitti gibi görünüyor. Trolling 4: Kullanıcı ctrl-c tuşlarına basarak "sıralama" işlemini iptal edemez.
Riot

4
5. kullanımı nedeniyle sadece GNU / Linux üzerinde çalışır /proc/cpuinfo.
kps11346

5
Son derece yaratıcı bir çözüm, bu arada :)
Dmitry 19

8
Bu harika. Bunun ne kadar harika olduğunu bile ifade edemiyorum. Bunu aktif olarak kullanmayı düşünüyorum, çünkü NEDEN DEĞİLSİNİZ.

4
Aslında üretimde bir yerlerde kullanımda bunun gerçekten bir çeşidi var. Ama bu durumda, sürecin çalışma zamanı önemlidir, bu yüzden benim bahanem ...
Riot

64

JavaScript'in yerleşik bir sort()işlevi vardır, bu şekilde kullanabilirsiniz:

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

... oh, tamamen söylemeyi unuttum, sözlük bilgisi sıralaması, yani 10 < 9ve 9 < -100. Muhtemelen yine de beklediğiniz budur.


8
Bu daha da iyi çünkü yerleşik bir işlev.
Wayne Werner

62

(jPL) jQuery Programlama Dili

Bunun için jQuery kullanmanız gerekir . Bu soruna basit bir çözüm şudur:

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
Özellikle bunun jQuery'i kullanma şeklini bilmiyorum .
KRyan

8
-1 Adlandırma dizi gerekir içinde Macar gösterimini içerir, özellikle jQuery nesneleri kullanılarak anlamına $dizileri kullanılarak, ave sonuçları window.promptolarak p.
Qantas 94 Heavy

2
"Zor kısmı" zarif. OP, bir gün bu tür bir kod yapısına sahip olmak için gayret göster.
Chris Barker

2
Bu F'n doble "doğrulama" LOOOOOOOOOOOOOOL omg omg gün yaptı! daha az büyük harf için düzenlendi
HC_

54

C

Bu çözüm, GNU / Linux'taki güçlü, yeniden kullanılabilir yazılım bileşenleri ile C'nin sağladığı özlü ve İS seviyesi erişimini birleştiriyor:

#include <stdlib.h>

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

4
Ya da bir "script": #!/usr/bin/sort.
Mekanik salyangoz,

54

Yakut

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

Oldukça kendini açıklayıcı.

Veya girişin gerçekte "çiftler dizisi" olmasını gerektirir:

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

gets.chompEkstra kötülük için kullanılmıyor . Ayrıca, izlemeden sonra regex kullanmak, ki OP'yi daha fazla karıştırmak için yapabileceğini bile bilmediğim bir şeydi (teşekkürler Jan Dvorak)!


4
Fikri genişleterek, kullanıcı dizeyi girinceye kadar tekrar tekrar girdi isterdim an array of doubles.
Wrzlprmft,

@Wrz Tamam, bitti :-)
Doorknob

2
Bu çok güzel, çünkü fakir OP, yeni bir çizgiden nasıl kurtulacağınızı bulmak zorunda kalacak ( getsbunun yerine kullanıyorsunuz gets.chomp).
wchargin

@WChargin Evet, ilk revizyonda yaptım (revizyon geçmişine bakın) ama daha da kötü olması için kaldırıldı>: D EDIT: Oh bekle, boşver, bu benim diğer cevabımdı. Bunu düzenleyeceğim :-)
Doorknob

1
+1 Burada sadece bir hesap yarattım, tam olarak nasıl cevap vereceğimi söylemek için! Sevdim!
DGM,

44

Python3.3

Elbette, işte stdin'deki değişmezler listesi olarak verilen bir diziyi sıralayabilen en basit Python programı:

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)

Ne yazık ki, yalnızca python3.3 + ile çalışır, çünkü yield fromifadeyi kullanır . Kod oldukça açıklayıcı olmalı, bu yüzden profesörünüze verirken herhangi bir problem yaşamamalısınız.


Trolling, OP'nin amacını tam olarak yapan, ancak aşağıdaki şekilde yapılan kusursuz bir şekilde çalışan bir çözüm sunmaktır :

  • anlamak imkansız (acemi tarafından)
  • öğretmenle ilgilenmek imkansız çünkü:
    • OP anlayamıyor
    • o öğretebilseydi bile, onu anlamak için deşifre etmeye vakti olmazdı
  • programlama onun için çok zor olduğunu düşünebilir saf bir acemi için korkutucu

Özetle, bu cevap, öğrencinin isteklerini alay etme konusundaki hayal kırıklığını, belirli bir açıdan mükemmel bir şekilde geçerli cevaplarla arttırır.


(Yukarıdaki kodu anlamakta zorluk çekiyorsanız okumayın)

Uygulanan sıralama algoritmasının gerçekte olduğu gerçeğiyle trolling'in de arttığını eklemeliyim.

kabarcık sıralama! ... kesinlikle bile OP'nin anlayabileceği şekilde uygulanabilirdi. Tek başına belirsiz bir algoritma değil, sadece OP'nin başka türlü mükemmel bir şekilde anlayabileceği bir şeyin kod gizlemesinden ibaret.


3
Bunun daha fazla açıklama kullanabileceğini düşünüyorum; şimdi cehenneme ne yapıyorsun
KRyan

1
Vay canına, ascii olmayan değişken isimleri python'da yapabilirsiniz. bilmiyordum ...
kratenko

1
@kratenko python3 + 'dan. Python2'de tercüman ASCII'yi kodlama olarak kabul eder ve bir hataya yol açardı. Python3'te tercüman UTF-8'i kodlama olarak kabul eder ve tanımlayıcılar için unicode özellikleriyle "harf" olan tüm karakterleri kabul eder.
Bakuriu,

3
@KRyan: Belli ki, insanları dokuz çevreye sokmak için Cehennemin kullandığı sıralama yöntemini kullanıyor.
Joe Z.

10
Oh aman Tanrım… è için +1.
Sean Allred

41

C - Yavaş, kullanımı zor, kabul edilemez kodlama stili

Sıralama algoritmasının kendisi yavaşlama noktası olarak bilinir ve yaklaşık n ^ (log n / 2) civarında en iyi durum karmaşıklığına (sadelik) sahiptir . Algoritma Andrei Broder ve Jorge Stolfi tarafından "Pessimal Algorithms and Simplexity Analysis" adlı makalesinde , iyi gülüşler ve düşünce için yemek için şiddetle tavsiye ediyorum.

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

Bununla birlikte, sıralamanın kendisi yararsızdır, bu yüzden kullanıcının sıralamak istediği verileri girmesi için bir yola ihtiyacımız var. Ayrıştırma ikiye katlanır ağrıdır, öyleyse neden bayt baytlarına girmiyorsunuz?

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

İşe yaradığını ispatlamak için:

 $ 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

Sonunda biz var:

  • Farkında olduğum en yavaş deterministik sıralama algoritması
  • Liste uzunluğunda sessiz kodlanmış sınırlar
  • Kesinlikle korkunç bir girdi, çıktıyı da benzer hale getirebilirim, ancak bu şekilde daha komik olduğunu düşünüyorum.
    • Şunu düşünün: Makinenizi programı kullanmak için hangi zenginliklerin olduğunu bilmeniz gerekir.
    • Ayrıca 0 giremezsiniz (-0 tamam)
  • İşaretçi aritmetik ve işaretçiler hangi şekilde olursa olsun, türler için hemen hemen hiç endişe duymazlar

Bu, 7 bayttan büyük tüm girişler için tanımsız davranışa sahiptir. Kabul edilebilir bir cevap değil.
Michael Spencer,

1
"Pessimal Algoritmaları" makalesini seviyorum; Teşekkürler.
Ryan,

“Bildiğim en yavaş deterministik sıralama algoritması” - kanıtlanabilir yavaş deterministik sıralama algoritması. Makalenin tamamı bu, AFAIR.
Konrad Rudolph

@MichaelSpencer Detaylandırmak ister misiniz? Girdi boyutu 24 bayt olan bir örnek verdim ve çıktı beklediğim gibi oldu (sanırım burada bir şaka eksik olabilir).
shiona

2
@Sasho ama bir bogo-sorti en iyi durumda \ Omega (n) çalışma süresine sahip (n-1 karşılaştırma, 0 işlem). Bu çok daha hızlı, aka. daha kötüsü, \ Omega'dan (n ^ (log n / 2)).
shiona

39

Ruby, kötü Bogosort! (Bonus: kullanıcı girişi ile 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 * ","

"Kötü" katlanmış:

  • gerçekten gerçekten gerçekten gerçekten gerçekten gerçekten gerçekten yavaş çalışır, tabii ki
  • dize karşılaştırmasını kullanır, böylece 10, 2'den küçüktür. .map &:to_fİkinci satıra eklenmiş olarak kolayca düzeltilebilir , ancak OP bunu bilemeyebilir
  • kullanılmıyorsa chomp, son sayının sonunda gizemli bir yeni satır var.
  • kullanmayan stripbu yüzden numaralar etrafında gizemli boşluk varsa virgül etrafında aralıkla girişi (ex. uzay 1.5, 2)

Ya da, nasıl tarafından bogosorting kullanıcı girişi ?! >: 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 * ","

Neden bogobogosort değil ? (antika bir O (n * (n!) ^ n) saatinde çalışır)
wchargin

@Wchargin Bunu düşünebilirim :-) en son düzenlememe ilgi duyabilirsiniz! (Yavaş olduğum için üzgünüm, şu anda bir bilgisayara erişemediğim için şu anda telefonum var :-P)
Doorknob

37

COBOL

Elbette! “Bir maymun bile bunu yapabilir!”

İşte girişi sizin için sıralayacak basit bir COBOL programı . Ne kadar önemsiz ve genişletilebilir olduğunu görmek için yorumları okuyun. Bunun asıl yararı denenmiş ve gerçek bir mekanizma olmasıdır, Java gibi yeni ve göreceli olarak denenmemiş dillere ve web tabanlı ya da Microsoft'a dayanmaz. Gerçekten etkili bir şekilde derlenir ve buna benzer prosedürler Fortune500'deki ve diğer endüstri liderlerindeki en başarılı finansal şirketler tarafından kullanılır. Bu kod birçok uzman tarafından incelenmiştir ve sıralama için mükemmel bir mekanizma olarak kabul edilmektedir.

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
Sadece bu sorunun cevabı için COBOL kullanırsınız. +1
syb0rg

5
Ah, delikli kartların taze kokusu
Sklivvz

3
@EbenezerSklivvze - LOL. Bir zamanlar Meclis kolej profesörüm sınıfa oldtimey kartlar hakkında bilgi verirken yer imi olarak kullandığım delikli bir kart çıkardım. Yeterince döşenmişti (1994 yılındaydı :). Çağdaşlarımın çoğunun hiç bir güverte gördüğünü sanmıyorum ...
DVK

30

OP, bunları NASIL sıralamak için NASIL ya da iki katına çıkacak tanımını söylemedi. Veri tipini varsaymak, doubleancak kopya olarak yorumlamak . Burada JavaScript kullanımı.

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

Sonuç: değişen sipariş [4, 11, 4, 9, 5, 7, 6, 7]


4
Msgstr "Veri tipini iki katına çıkarmak, ancak kopya olarak yorumlamak". Sadece gerçek bir dahi böyle düşünürdü. Sadece mükemmel!
Felipe Miosso

@FelipeMiosso Dürüst olmak gerekirse, sadece alaycı olup olmadığınızdan emin değilim ...
Kiruse

1
Haha ... Alaycı davranıyordum. Dışarıda gerçekten böyle düşünen insanlar olduğunu biliyorum. Neyse ... cevabınız epikti! Çok güldüm.
Felipe Miosso

@FelipeMiosso Gülmek için yardımcı olacağım için sevindim. ;)
Kiruse

console.log her şey!
Emil Vikström

28

PHP

İşte hata işleme ile tam bir uygulama. Herhangi biri için en hızlı olanıdır 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 ++ 'da sonraki permutasyon, dizi sıralandığında true (aksi takdirde izin verdikten sonra) yanlış olduğunda çalışır. Bu yüzden diziyi sıralamanız ve sonra yukarıdaki gibi bir do-use kullanmanız gerekir (bu yüzden tam bir daireyi tekrar sıralanan diziye çevirir).


+1 next_permutationCevabım için kullanmayı düşündüm , ama bu aklımdan daha temiz.
jliv902

25

[zamanında yanlış yönlendirme ile çözüm]

Lütfen, ilgili standart olan IEC 60559: 1989 Burada , satın alabileceğiniz mikroişlemci sistemleri için ikili kayan nokta aritmetiği spesifikasyonunu okuyun . §5.10 için dipnot olarak totalOrder yüklem Ayrıntıları , bu belirtilmektedir:

totalOrder, biçimindeki tüm kodlamalar için toplam sipariş vermez. Özellikle, aynı kayan noktalı gösterimin farklı kodlamaları arasında, bir veya her iki kodlamanın da kanonik olmadığı durumlarda ayrım yapmaz.

Böylece çiftleri sıralamak için kod yazmanın imkansız olduğunu görüyoruz. Bu hileli bir soru. Ha, ha, çok akıllıca! Lütfen profesörünüze bu dersten çok zevk aldığımı söyleyin.

[değiştir: hiçbir şey beni gerektirir değil sorun toplam sipariş talepleri olduğunu varsaymak]


3
Ancak sorun çiftleri ayırmaktı. Değerlerin (toplam) sıraya sahip olması gerekmiyordu. Örneğin, diziyi iki, pozitif ve negatif sayıya ayırabilirsiniz. Soruyla iki katına çıkmıştın.
shiona

23

Kötü bir JavaScript:

OP, sana her şeyi vermek istemiyorum bu yüzden kullanıcıdan kendi başına nasıl girdi alacağını çözmene izin vereceğim (ipucu: kullan prompt).

Bunu yaptıktan sonra, sıralamak için dizinizi içine aktarabileceğiniz bir işlev. Yalnızca diziyi, dizideki en düşük değeri ve bir artış sağlamanız gerekir:

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

İşte örnek kullanıcı girişi ile [1.5, -3.5, 12, 10, -19.5] etkinliğini görmek için bir keman.


Not: Eldeki sorun için düşük performanslı, karmaşık ve uzlaşılamaz olmasının yanı sıra, OP kayan nokta matematiğini bilmiyorsa, bu özellikle sinir bozucu olacaktır. Örneğin, kullanıcı girişi [8.1, 5, -.8, 2.3, 5.6, 17.9]ve OP basit değerleri seçerse (yani minimumVal=-.8ve increment=.1), program sonsuza dek çalışır. İlgili bir notta, şu anda bu sorun nedeniyle çalışmayan 2 sekmeden gurur duyuyorum :)

Not II: Yukarıdaki kodu yazarken bile iğrenç hissettim.

Not III: MWA HAHAHAHA!


İyi fikir. Programcı bir acemiyken, havalı olmalısın.
Pierre Arlaud

22

İşte Java için sevdiğim gerçek bir cevap :

Println önce Satır ekleyin ve diziniz sıralanmayacak

Arrays.sort( array );

Hiçbir açıklama, OP karıştırır , ama çalışır ve daha deneyimli programcılar upvotes alacak.


Başka bir benzer cevap :

Arrays.sort () ' a bakınız.

Dolaylı olarak, OP'ye kendisine belirsiz bir doğru cevap verirken kendi araştırmasını yapmasını söyleme. Daha fazla araştırma yapılmadan OP'nin kafası karışır . Ayrıca bağlantının eski belgelere işaret etmesini de seviyorum.


10
Bu yararlıdır ve bu nedenle aşağı oylamaya layıktır.
emory

11
"Dolaylı olarak, OP'ye kendisine belirsiz ve doğru bir cevap verirken kendi araştırmasını yapmasını söyleyerek" hemen hemen "StackOverflow cevaplama tarzımı anlatıyor: /
Corey Goldberg

7
"Arrays.sort () 'a bir göz atın" ... "Programımda nasıl kullanılacağına bir örnek alabilir miyim?" ... parlak.
SimonT

5
+1 özellikle mütevazi OP'mizin muhtemelen bir sınıf için kendisini bir sınıf yazması gerektiğinden, Array.sort () 'u tamamen işe yaramaz kılıyor.
Kevin,

2
Ctrl + F -> "Programımda nasıl kullanılacağı hakkında bir örnek alabilir miyim?" = 3 sonuç.
Qix

21

JAVA'daki sıralama problemi için genetik algoritma / Monte Carlo metodu

Sıralama sorununun uzun süredir bilime göre bildiği biliniyor ve birçok iyi çözüm bulundu. Son yıllarda, biyobilgisayar alanında ve biyolojinin problemleri nasıl çözdüğüne bakma konusunda büyük ilerlemeler olmuştur ve zor problemlerin çözülmesinde çok yardımcı oldu. Bu sıralama algoritması, sıralama problemini çözmek için bunları kullanmak için bu fikirlerden en iyisini alır. Fikir oldukça basit. Sırasız bir diziyle başlar ve bunun ne kadar sıralı olduğunu görün. "Sıralı" bir puan verin ve sonra rastgele bir bileşenle diziye izin verin - tıpkı ebeveynler hakkında her şeyi bilseniz bile, tıpkı çocukların nasıl görüneceği net değildir. Bu genetik algoritma kısmıdır. Söylemek için bu dizinin yavrularını yaratıyorsunuz. O zaman, yavruların ebeveyne göre daha iyi sıralanıp toplanmadığını görürsünüz (diğer bir deyişle en uygun olanı! Bu durumda, bir sonraki permütasyonu oluşturmak için başlangıç ​​noktası olarak bu yeni dizi ile devam edersiniz ve dizi tamamen sıralanıncaya kadar devam eder. Bu yaklaşımla ilgili en güzel şey, dizi zaten baştan biraz sıralıysa, daha kısa sürmesidir!

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

}

Ekstralar

  • Java.awt.List'in kötüye kullanılması
  • tutarsız ve hatalı değişken adlandırma
  • biyobilgisayar hakkında tamamen saçma filan
  • açıklamada yaratıcı ve tutarsız dil
  • Monte Carlo, basitçe ileri doğru deterministik problemler için yanlış bir araçtır
  • gereksiz ithalat
  • muhtemelen daha fazla güzellik ...

Bu GA veya Monte Carlo'ya başka bir trol seviyesi mi diyorsunuz? Bunun randomize bir tepe tırmanma algoritması olduğuna inanıyorum.
shiona

bu programı buzzword isimleriyle ilişkilendirmek kasıtlıydı, fakat "randomize tepeye tırmanma algoritması" nı hiç duymadım ... ve daha geniş anlamda, GA ve Monte Carlo'nun açıkça yanlış olmak için çok uzak olmadığını düşünüyorum ...
luksch

19

piton

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

Diziyi (liste) 3. ve 5. ondalık basamakların toplamına göre sıralar .


5
Ne yazık ki, bu sonraki her şeyi kaldırarak lambda x:ve onunla değiştirerek önemsizce düzeltildi x. Yine de, yeni başlayan bir kodlayıcı bunu asla bilemezdi, bu yüzden kudos!
Joe Z.

18

C ++

Bu çalışır ... sonunda.

İşte sıralama algoritmam:

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

İşte tam program:

#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
"Algoritma" türün beni gözyaşlarına boğdu.
Nate,

Hah, bu bir algoritma değil çünkü bitirmek için onaylanmadı.>: D
jmacedo

@joxnas, aslında deterministik olmayan rastgele cihazların bulunmadığı sistemlerde, randomizer aslında periyodik olabilir. O zaman basitçe randomizer tarafından izin verilen muhtemel permütasyonlar setinin, $ n $ olan tüm olası giriş dizisi uzunlukları için muhtemel permütasyonlar $ S_n $ 'ı sağlayıp sağlamadığına bağlı olacaktır.
böcek

Aw pantolon, LaTeX'in yalnızca TeX.SE ve Math.SE'de desteklendiğini unuttum. Sadece snooty italix'teki sembolleri hayal et.
Böcek

18

İşte, gözlerini şölen:

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

Bu kod parçası diziyi görüntüler ve kullanıcıdan dizinin en küçük çiftini girmesini ister. Ardından numarayı sıralanmış numaralar listesine ekler, diziyi çiftten kaldırır ve kalan dizi numaralarını görüntüler.

* Yanlış yorumlama: Zayıf nokta, ancak OP, programdan kullanıcıdan sıralamadan yardım istemesini beklemiyor.

* Hile yapmak: Kullanıcı, gerçek sıralama yapan kişidir.

* Verim: Dizinin her sayısı bir sunucu dönüşü gerektirir ve kullanıcının en küçük sayıyı manuel olarak bulmasını gerektirir. Performans daha da kötüleşemez.

* Kabul Edilemez: Sanırım bunu anladım. Ve tekrar kullanmanın iyi şanslar. En kötüsü en kötüsüdür, kullanıcı kodun% 90'ından kurtulur ve her seferinde en küçük değerleri bulmak ve bunları en düşük verimli sıralama algoritmalarından birini verecek şekilde tekrarlamak için tekrar tekrar döngüye girer.

* Yaratıcı ve kötülük: sen söyle.


2
'Gözlerini ziyafet' diyorsun ve bana PHP Oo ver
Aidiakapi 19

3
“Kötülük” şartların bir parçasıydı, değil mi?
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
Kredilerin verildiği yerdeki kredi: dangermouse.net/esoteric/intelligentdesignsort.html
wchargin

1
Akıllı tasarımı neden bir programlama yarışmasında yakaladığınızı anlamıyor musunuz?
khebbie

12
@khebbie Neden olmasın?
Konrad Rudolph

Sorun şu ki, kullanıcı rakamları giren kullanıcı ise, o zaman kendisinden daha zeki olacaktır. ;)
d -_- b

16

Python - gerekli 1.

Bu kod, çift sıradan oluşan bir ağaç oluşturarak ve ardından tekrarlayan bir şekilde yineleyerek, sayısal sırayı artırmak yerine çiftleri sözlük sırasına göre sıralar.

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

Zaman içinde çalışır n log nve aslında başka bir sıralama listesini tutmak için akıllı bir yoldur, ancak ne yazık ki OP için tamamen yanlış bir şey yapar.


4
Ayrıca, tüm sayılar ondalık sayıdan önce aynı sayıdaki hanelere sahipse, aslında doğru çalışacaktır, bu nedenle OP, yalnızca bir girdi kullanarak test ederse, sıranın yanlış bir şey yaptığını fark etmeyebilir. söyle 2, 1, 3, 8, 5.
Joe Z.

14

Çiftler dizisini sıralar. Java’da:

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

Örneğin:

[0.0, 1.5, 123]

için sıralanmamış ikili gösterimden

011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000

zarif bir şekilde sıralanmış

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111


11

Kullanıcının bir çiftler dizisi girdiği ve programın dizilmiş diziyi çıkardığı bir programa ihtiyacım var. Lütfen kodu verebilir misiniz?

Kealist başına düzenleme, bölüşümü makul görünmesi için yorum yapmanın daha iyi olacağını düşünüyorum. In Rebol'a ...

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

İkilinin ne olduğunu gerçekten bilmedikleri fikrinden yola çıkarak, bir çift listesinin iki ile çarpılan sayıların olduğuna inanıyor olabilir.


6
Belki girdi zaten ikiye katlandığından yarıya çıkmaları gerekiyor!
kealist

@kealist, bunun “ikiye katlamanın” gerçekleştiği fikri üzerinde oynadığını düşündüm. [2 * num] 'a sahip olmak biraz daha iyi gizlice olduğunu düşünüyorum.
Dr. Rebmu

10

Soruyu kasten yanlış anlama:

Özyinelemeli bir yaklaşım kullanarak:

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

Sıralanan dizinin, herhangi bir sıralama türü ve hatta bu yaklaşımı son derece esnek kılan girdi için herhangi bir ayırıcı türü için bile herhangi bir noktada, herhangi bir sıralama türü için bir noktada çıktılanması garanti edilir. Başlıca dezavantajı, büyük diziler için biraz yavaş olmasıdır, ancak bunu çoklu okuma ile kolayca çözebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.