Saya membutuhkan program di mana pengguna memasukkan array ganda dan program output array diurutkan


280

Catatan: Pertanyaan ini sangat diedit sejak saya pertama kali diposting di sini. Peraturan dipindahkan ke sini , membacanya sebelum memposting jawaban untuk memahami tujuan ini. Ini adalah pertanyaan pertama yang dibuat dalam kategori .

Bayangkan seorang pengguna yang malas di Stack Overflow menanyakan pertanyaan ini:

Saya membutuhkan program di mana pengguna memasukkan array ganda dan program output array diurutkan. Bisakah Anda memberikan kodenya?

Bagaimana Anda bisa membuat sepotong kode yang akan menjebak pengguna ini? Buat sepotong kode yang akan berguna bagi programmer yang tidak berpengalaman tetapi sama sekali tidak berguna dalam praktiknya.

Pemenangnya adalah jawaban yang paling banyak dipilih, kecuali jika jawabannya entah bagaimana tidak memenuhi syarat (untuk persyaratan yang memenuhi syarat, lihat deskripsi wiki tag tentang ). Jika jawaban yang paling banyak dipilih sebelumnya dikalahkan di kemudian hari dalam jumlah upvotes setelah diterima, jawaban terbaik yang baru diterima dan yang sebelumnya tidak diterima. Dalam hal seri, saya akan memilih pemenang sesuka hati di antara yang terikat atau hanya menunggu sedikit lagi.

Jawaban yang tidak memiliki kode tidak memenuhi syarat. Mereka mungkin menyenangkan dan mendapatkan beberapa perbaikan, tetapi mereka tidak akan diterima.

Aturan dapat ditemukan di deskripsi tag .

Catatan: Ini adalah pertanyaan . Tolong jangan menganggap pertanyaan dan / atau jawaban dengan serius. Informasi lebih lanjut di sini .



6
@bluesm Jika seseorang telah memutuskan untuk meminta orang lain untuk menyelesaikan masalah mereka alih-alih "membuang-buang" waktu belajar mereka sendiri, memposting tautan ke tempat mereka dapat belajar sendiri tidak akan ada gunanya.
IQAndreas

3
Wow, pertanyaan ini akan mendapatkan 100 upvote dan 10.000 tampilan dalam waktu kurang dari 24 jam!
Joe Z.

18
Ya ampun, Victor, kotak Tentang Anda sangat menyedihkan ... kita semua mengalami pasang surut tetapi Anda tidak harus menyalahkan diri sendiri. Anda adalah pahlawan bagi Pegolf Kode di mana-mana sekarang!
SimonT

4
Aku heran tidak ada yang telah menawarkan solusi berdasarkan tidur semacam belum
Frank Farmer

Jawaban:


178

Terkadang komunitas di sini tidak suka membantu pekerjaan rumah. Itu sebabnya Anda mendapatkan begitu banyak jawaban lelucon. Tapi saya suka membantu. Berikut ini adalah solusi lengkap dalam 'C' (karena saya menganggap Anda ingin belajar "pemrograman", bukan "scripting" dengan Java atau Ruby). Saya sudah memasukkan banyak tips yang saya harap saya tahu ketika saya pertama kali belajar

#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
hampir semua saran itu salah, dan itu terus meminta daftar input sampai Anda memasukkannya sudah diurutkan.
AShelly

47
+1, untuk 1st, 2th, 3th, 4th...dan operator downto - teknik pemrograman C yang sangat canggih.
Kaya

5
Harus digunakan sscanf(input, "%5s", &input[0]), jika tidak mungkin ada bug overrun saat mengurai input. Dan input harus dinyatakan char input[sizeof(int)+1], untuk kompatibilitas ke belakang dengan sistem 64-bit.
sh1

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

15
Jawa memiliki pengumpulan sampah. Karena itu Java adalah untuk "scripting", bukan pemrograman nyata. Itu dasar CS101. (Demikian kata troll.)
AShelly

181

Ini dia di java. Ini sangat curang, tidak dapat diterima dan tidak dapat diperbaiki karena menciptakan database MySQL, memasukkan nomor di sana, melakukan pemilihan dengan klausa ORDER BY dan menampilkan angka-angka yang diberikan oleh MySQL. Faktanya, MySQL yang melakukan penyortiran, bukan program.

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
Itu sebenarnya agak terlalu dekat dengan rumah untuk apa yang banyak Java coders akan anggap cocok dengan solusi untuk spesifikasi !!
Dr. Rebmu

10
Pertimbangkan juga kasus di mana Anda perlu mengurutkan sejumlah besar objek. Mengurutkan mereka "di luar program" dalam database adalah solusi yang masuk akal.
Viktor Seifert

40
Tidak cukup abstraksi di sini. Anda memerlukan setidaknya 10 antarmuka, 20 implementasi, enum, tes unit, tes cakupan, Maven, tes integrasi, mengejek ...
Naftuli Kay

6
@NaftuliTzviKay Kita harus membuat MySQLSortEnterpriseEdition untuk mengimplementasikan ide Anda. Apakah Victor setuju untuk lisensi GPL kode di sini sehingga kami dapat memulai?
Joe Z.

14
@ Joz. Ya, jawaban saya kurang komentar tentang model lisensi dan saya harus membuat pengguna menerima EULA di awal program. Tapi karena saya memberikannya kepada OP malas, itu gratis untuk penggunaan non-komersial, termasuk berguna untuk membuat premium MySQLSortEnterpriseEdidtion premium yang telah lama ditunggu-tunggu.
Victor Stafusa

142

C # - Tidak ada pembunuhan seperti pembunuhan yang berlebihan

Pertama-tama, GiMmEtHaCoDeZ yang terhormat, mari kita coba untuk menjabarkan tugas Anda:

  1. Baca angkanya
  2. Sortir mereka
  3. Keluarkan angka yang diurutkan.

Karena "Membagi dan menaklukkan" adalah strategi yang sangat penting ketika bekerja dengan masalah perangkat lunak, mari kita atasi satu per satu

1. Membaca

Masalah penting lainnya dalam perangkat lunak adalah fleksibilitas. Karena tidak ditentukan bagaimana pengguna akan memasukkan angka, itu bisa terjadi melalui konsol, melalui file, melalui layanan web, dll. Mungkin bahkan beberapa metode yang tidak dapat kita pikirkan saat ini. Jadi, penting bahwa solusi kami akan dapat mengakomodasi berbagai jenis input. Cara termudah untuk mencapai itu adalah mengekstraksi bagian penting ke antarmuka, katakanlah

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

  DoubleArrayReaderType Type {get;}
}

di mana DoubleArrayReaderTypepencacahan diberikan dengan

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

Penting juga untuk membuat perangkat lunak dapat diuji dari bawah ke atas, sehingga implementasi antarmuka akan dilakukan

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

Selanjutnya, pertanyaan logisnya adalah bagaimana kita akan tahu memuat yang sesuai IDoubleArrayReaderke dalam kode. Itu mudah asalkan kita menggunakan pabrik sederhana:

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

Perhatikan bahwa, kami menggunakan refleksi untuk memuat semua pembaca aktif, sehingga ekstensi apa pun di masa mendatang akan tersedia secara otomatis Sekarang, di tubuh utama kode tidak aktif yang baru saja kita lakukan:

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

2. Memproses (menyortir)

Sekarang kita perlu memproses, yaitu mengurutkan angka yang telah kita dapatkan. Perhatikan bahwa langkah-langkahnya benar-benar independen satu sama lain, jadi untuk subsistem pengurutan, tidak masalah bagaimana angka-angka itu dimasukkan. Selain itu, perilaku penyortiran juga merupakan sesuatu yang dapat berubah, misalnya kita mungkin perlu memasukkan algoritma penyortiran yang lebih efisien. Jadi, tentu saja, kami akan mengekstrak perilaku pemrosesan yang diminta dalam antarmuka:

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

  DoubleArrayProcessorType Type {get;}
}

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

Dan perilaku penyortiran hanya akan mengimplementasikan antarmuka:

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

Tentu saja, kita akan membutuhkan pabrik untuk memuat dan mengelola instance pemrosesan.

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. Menulis output

Tidak banyak yang bisa dikatakan di sini, karena ini adalah proses yang mencerminkan input. Bahkan, kita bisa menggabungkan pabrik baca dan tulis menjadi satu DoubleArrayInputOutputFactory, seperti ini:

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

}

Menyatukan semuanya

Akhirnya, program utama kami hanya akan menggunakan semua kehebatan yang telah kami bangun, jadi kodenya adalah:

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

di mana, misalnya kita dapat mendefinisikan reader, writerdan processormenggunakan

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 untuk overcoding gila. Saya sarankan Anda membagi jawaban Anda menjadi 3 atau lebih 'modul' jawaban sehingga saya dapat memberi mereka +1 secara individu
greggo

15
Dan ceri di atas adalah bahwa itu benar-benar menggunakan semacam perpustakaan :) Ini sepenuhnya ke spec, dan benar-benar tidak berguna
SWeko

9
Itu ... sangat ... indah.
Andrew

7
Menggunakan DI hanya akan membingungkan OP, karena ini hanyalah contoh cepat.
SWeko

132

Penafsiran yang lebih harfiah:

echo " aaehrrty"

yaitu, "array" diurutkan.


5
Saya datang ke sini untuk memposting ini.
Quuxplusone

5
simpan sebagai file sort.shdan panggil sebagaish sort.sh "an array of doubles"
Kyss Tao

Saya pikir Anda melewatkan "input pengguna array ganda".
Dukeling

1
@ Berenang itulah yang menjadi inti dari komentar Kyss Tao. "an array of doubles"dapat diteruskan ke skrip sebagai argumen baris perintah.
AJMansfield

108

Perl

Dari semua hal yang saya lakukan untuk CodeGolf.SE, ini mungkin paling lama, setidaknya beberapa jam.

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

Input berbentuk [2,4,5,7,7,3]dan output berbentuk [2,3,4,5,7,7].

Saya tidak punya waktu untuk menjelaskan sekarang ... kembali lagi nanti.

Bagaimanapun, ada sesuatu yang disebut array anonim di Perl. Ini adalah array, tetapi tidak memiliki nama. Apa yang kita ketahui, bagaimanapun, adalah referensi (lokasi memori) yang menunjuk padanya. Serangkaian angka dalam kurung siku menciptakan array anonim, dan mengembalikan referensi ke sana.

Jawaban ini dibangun dari serangkaian array anonim, referensi yang disimpan dalam @_. Input diubah menjadi array anonim. Kami kemudian membuat array anonim lainnya, masing-masing elemen yang merupakan referensi ke elemen dalam array sebelumnya. Alih-alih mengurutkan elemen dalam array, kami mengurutkan pointer ke elemen dalam array itu. Kami juga membuat array baru untuk setiap langkah (dan banyak lagi) dalam operasi sortir.


3
jahat! jahat! jahat!
DGM

56
tentang dapat diuraikan seperti naskah Perl lainnya untuk saya :)
Corey Goldberg

6
@swelljoe Sebenarnya, $_adalah string kosong pada saat itu. Saya menyimpan keluaran yang saya inginkan $\ , yang merupakan pemisah catatan keluaran.
PhiNotPi

4
@Andy sederhana. "Bagaimana cara kerjanya?"
John Dvorak

1
dan semua variabel yang dibuat pengguna memiliki nama-nama cantik yang mengikuti semua konvensi yang masuk akal
Hagen von Eitzen

80

Python

Memberi pengguna array yang diurutkan dengan menghapus semua elemen yang tidak berurutan dari array input.

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 berjalan melalui daftar hanya menambahkan setiap elemen jika tidak membuat daftar dibatalkan. Jadi outputnya adalah daftar yang diurutkan, hanya saja tidak ada yang berisi semua elemen dari daftar asli. Jika op hanya memeriksa apakah daftar dalam urutan diurutkan, ia mungkin tidak memperhatikan bahwa outputnya hilang nilainya.


1
Silakan lihat jawaban lain sebelum memposting jawaban Anda. Anda harus menambahkan nama bahasa Anda. Untuk menjawab pertanyaan ini, Anda juga perlu menjelaskan secara singkat apa yang Anda lakukan untuk mengendalikan OP.
Wasi

5
Hehe, yang ini benar-benar membuatku tertawa terbahak-bahak. Bagaimanapun, saya setuju bahwa sedikit penjelasan yang lebih baik akan sangat membantu.
oconnor0

2
Apakah panggilan ganda untuk sys.stdin.read()salah ketik atau bagian dari jawaban trolling yang sebenarnya? Tentunya akan membuat OP frustrasi untuk memberikan array sebagai input dan terus menunggu hasilnya ...
Bakuriu

Wow, itu jahat, benar.
Sylverdrag

13
Sebuah O(n)algoritma semacam. Bagus.
ejrb

65

Bash, 54 karakter

Banyak jawaban menggunakan bahasa lambat yang tidak efisien seperti C dan Python ... mari kita mempercepat sedikit dengan menawarkan solusi pada ibu dari semua bahasa scripting: Bash.

Saya tahu apa yang Anda pikirkan - Bash bahkan tidak bisa menangani aritmatika floating point, jadi bagaimana cara memilah, kan? Nah, lihatlah, implementasi saya dari algoritma SleepSort yang perkasa:

#!/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 ini dilengkapi dengan input sebagai argumen commandline. Contoh dijalankan:

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

Ini juga memiliki keunggulan mungkin yang paling pendek dari semua algoritma yang disajikan di sini. Itu benar - satu garis besar bash , hanya menggunakan bash builtin dan tidak memanggil binari eksternal (yaitu, jika Anda tidak menghitung output verbose murni opsional). Berbeda dengan bogosort, runtime-nya bersifat deterministik.

Kiat: Optimalisasi yang efektif adalah membagi angka input dengan faktor sebelum mengurutkan. Implementasi diserahkan kepada pembaca.

Sunting:

Versi golf 54-char yang diperpendek dengan pencetakan yang kurang cantik:

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

11
Trolling 1: Algoritme tidak bekerja, tetapi jelas berpotensi sangat lambat - itu memunculkan thread untuk setiap nomor, tidur untuk jumlah detik sebelum menghasilkan nomor (yang dengan demikian dalam urutan). Trolling 2: Selain itu, sebagian besar kode dihabiskan untuk menulis komentar yang bagus tentang berapa banyak thread pemijahannya, dan membaca dan mem-parsing info cpu sistem secara tidak perlu hanya demi beberapa keluaran verbose tambahan. Trolling 3: Ini output "array diurutkan" di akhir, yang tampaknya menjadi hal yang dilakukan. Trolling 4: Pengguna tidak dapat membatalkan "sortir" dengan menekan ctrl-c.
Kerusuhan

4
5. Ini hanya berfungsi pada GNU / Linux , karena penggunaan /proc/cpuinfo.
kps11346

5
Omong

8
Ini luar biasa. Aku bahkan tidak bisa mengungkapkan betapa hebatnya itu. Saya sedang mempertimbangkan untuk menggunakan itu secara aktif, karena MENGAPA TIDAK.

4
Sebenarnya saya benar-benar memiliki varian ini yang digunakan dalam produksi di suatu tempat. Tetapi dalam situasi itu, runtime dari proses itu penting, jadi itu alasan saya ...
Kerusuhan

64

JavaScript memiliki sort()fungsi bawaan, Anda dapat menggunakannya seperti ini:

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

... oh, benar-benar lupa menyebutkan, itu mengurutkan dalam urutan leksikografis, yaitu 10 < 9dan 9 < -100. Mungkin memang itu yang Anda harapkan.


8
Itu bahkan lebih baik karena ini adalah fungsi bawaan.
Wayne Werner

62

(jPL) jQuery Programming Language

Anda harus menggunakan jQuery untuk itu. Solusi sederhana untuk masalah ini adalah yang berikut:

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
Saya terutama suka bagaimana ini tidak benar - benar menggunakan jQuery.
KRyan

8
-1 Penamaan array Anda harus menyertakan notasi Hungaria di dalamnya, khususnya objek jQuery yang ditandai menggunakan $, array menggunakan, adan hasil window.promptas p.
Qantas 94 Heavy

2
"Bagian rumit" elegan. OP, berusahalah untuk memiliki semacam struktur kode suatu hari nanti.
Chris Barker

2
F'n doble "validasi" LOOOOOOOOOOOOL omg hari dibuat! diedit dengan huruf besar
HC_

54

C

Solusi ini menggabungkan keringkasan dan akses tingkat OS yang disediakan oleh C dengan komponen perangkat lunak yang kuat dan dapat digunakan kembali di GNU / Linux:

#include <stdlib.h>

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

4
Atau "script": #!/usr/bin/sort.
Siput mekanik

54

Rubi

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

Cukup jelas.

Atau minta input untuk benar-benar menjadi "array ganda":

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

Tidak menggunakan gets.chompkejahatan ekstra. Juga menggunakan regex setelah trailing sampai, yang merupakan sesuatu yang saya bahkan tidak tahu Anda bisa lakukan (terima kasih Jan Dvorak) untuk membuat OP lebih bingung!


4
Memperluas gagasan, saya akan berulang kali meminta input sampai pengguna memasukkan string an array of doubles.
Wrzlprmft

@Wrz Ok, dilakukan :-)
Doorknob

2
Itu ekstra hebat karena OP yang buruk harus mencari cara untuk menyingkirkan baris baru (karena Anda menggunakan getsbukan gets.chomp).
wchargin

@WChargin Yap, saya memiliki itu di revisi pertama (lihat sejarah revisi) tetapi menghapusnya menjadi lebih jahat>: D EDIT: Oh, tunggu, sudahlah, itu jawaban saya yang lain. Saya akan mengedit yang ini :-)
Gagang Pintu

1
+1 Saya membuat akun di sini hanya untuk mengatakan, beginilah cara saya akan menjawabnya! Suka!
DGM

44

Python3.3

Tentu, inilah program Python paling sederhana yang dapat mengurutkan array yang diberikan sebagai daftar literal di 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)

Sayangnya itu hanya bekerja di python3.3 + karena menggunakan yield fromekspresi. Kode tersebut harus cukup jelas, jadi Anda seharusnya tidak memiliki masalah ketika menyerahkannya kepada profesor Anda.


Trolling adalah dalam memberikan solusi yang berfungsi sempurna yang melakukan persis apa yang diinginkan OP, tetapi dengan cara yaitu:

  • mustahil dimengerti (oleh pemula)
  • mustahil untuk ditangani guru karena:
    • OP tidak bisa memahaminya
    • bahkan jika dia bisa, guru tidak akan punya waktu untuk menguraikan untuk memahaminya
  • menakutkan bagi seorang pemula yang naif yang mungkin berpikir bahwa pemrograman itu terlalu sulit baginya

Singkatnya jawaban ini akan sangat meningkatkan frustrasi siswa mengejek permintaan mereka dengan jawaban yang benar-benar valid dari sudut pandang tertentu.


(Jangan membaca jika Anda menganggap tantangan memahami kode di atas)

Saya harus menambahkan bahwa trolling juga ditingkatkan oleh fakta bahwa algoritma sorting yang diterapkan sebenarnya

semacam gelembung! ... yang tentunya dapat diimplementasikan dengan cara yang bahkan OP dapat mengerti. Ini bukan algoritma yang tidak jelas per se, hanya kode-kebingungan yang baik dari sesuatu yang OP dapat pahami dengan sempurna.


3
Saya pikir ini bisa menggunakan lebih banyak penjelasan; apa yang kamu lakukan pada Inferno sekarang?
KRyan

1
Wow, Anda dapat melakukan nama variabel non-ascii dengan python? tidak tahu ...
kratenko

1
@kratenko Dari python3 +. Dalam python2 interpreter mengasumsikan ASCII sebagai encoding dan akan menimbulkan kesalahan. Dalam python3 interpreter mengasumsikan UTF-8 sebagai encoding dan menerima semua karakter yang "huruf" oleh properti unicode untuk pengidentifikasi.
Bakuriu

3
@ KRyan: Dia jelas menggunakan metode penyortiran yang digunakan Hell untuk membuat orang masuk ke sembilan lingkaran.
Joe Z.

10
Ya ampun ... +1 untuk è.
Sean Allred

41

C - Lambat, sulit digunakan, gaya pengkodean tidak dapat diterima

Algoritma pengurutan itu sendiri dikenal sebagai slowsort, dan memiliki kompleksitas kasus terbaik (simpleksitas) sekitar n ^ (log n / 2) . Algoritme telah diterbitkan oleh Andrei Broder dan Jorge Stolfi dalam makalah besar mereka "Pessimal Algorithms and Simplexity Analysis" yang sangat saya rekomendasikan untuk tertawa dan makanan untuk dipikirkan.

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

Namun pengurutan itu sendiri tidak berguna, jadi kami membutuhkan cara bagi pengguna untuk memasukkan data yang ingin mereka urutkan. Parsing ganda adalah rasa sakit, jadi mengapa tidak memasukkan mereka byte demi byte.

const unsigned MAX_ELEMS = 100;
int main()
{
        int i=0, j=0, len;
        char a[MAX_ELEMS*8];
        double* arr = (double*) a;
        short isNull=1;

        while(1) {
                a[i++] = getchar();
                if(i%8 == 0) {
                        if(isNull)
                                break;
                        isNull = 1;
                }
                else if(a[i-1] != 0)
                        isNull = 0;
        }

        len=i/8 - 1;

        sort(arr, len-1, 0, len-1);

        for(i = 0; i < len; i++)
        {
                printf("%f ", arr[i]);
        }
}

Untuk membuktikan bahwa itu berfungsi:

 $ 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

Pada akhirnya kami memiliki:

  • Algoritma pemilahan deterministik paling lambat yang saya sadari
  • Batas kode keras diam pada panjang daftar
  • Masukan yang benar-benar mengerikan, saya juga bisa membuat keluaran serupa tetapi saya pikir ini lebih lucu dengan cara ini.
    • Pertimbangkan: Anda perlu mengetahui endianess yang digunakan mesin Anda untuk menggunakan program ini.
    • Anda juga tidak dapat memasukkan 0 (-0 ok)
  • Pointer aritmatika dan cukup banyak tidak peduli untuk jenis sebagai petunjuk dicor dengan cara apa pun

Ini memiliki perilaku tidak terdefinisi untuk semua input yang lebih besar dari 7 byte. Bukan jawaban yang bisa diterima.
Michael Spencer

1
Cinta kertas "Algoritma Pessimal"; Terima kasih.
Ryan

“Pemilahan algoritma deterministik paling lambat aku sadar” - yang provably algoritma sorting deterministik paling lambat. Itulah inti dari makalah ini, AFAIR.
Konrad Rudolph

@MichaelSpencer Care ingin menjelaskan? Saya memberi contoh dengan ukuran input 24 byte dan output adalah apa yang diharapkan (saya pikir saya mungkin kehilangan lelucon di sini).
shiona

2
@Sasho tetapi bogo-sort memiliki waktu berjalan terbaik dari \ Omega (n) (perbandingan n-1, 0 operasi). Jauh lebih cepat, alias. lebih buruk, daripada \ Omega (n ^ (log n / 2)).
shiona

39

Ruby, Bogosort jahat! (Bonus: bogosort berdasarkan input pengguna)

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

Liku "jahat":

  • berjalan sangat sangat sangat sangat sangat lambat, tentu saja
  • menggunakan perbandingan string, jadi 10 kurang dari 2. Dapat diperbaiki dengan mudah dengan .map &:to_fditambahkan ke baris kedua, tetapi OP mungkin tidak tahu itu
  • tidak menggunakan chompsehingga nomor terakhir memiliki baris baru yang misterius di akhir
  • tidak menggunakan stripsehingga ada spasi putih misterius di sekitar angka jika input dengan spasi di sekitar koma (mis. Spasi di 1.5, 2)

Atau, bagaimana dengan bogosorting dengan input pengguna ?! >: 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 * ","

Kenapa tidak bogobogosort ? (berjalan dalam pelik O (n * (n!) ^ n) waktu)
wchargin

@Wargargin Saya dapat mempertimbangkannya :-) Anda mungkin tertarik dengan hasil edit terbaru saya! (Maaf karena lambat, aku benar-benar di ponsel saya sekarang karena saya tidak dapat mengakses komputer :-P)
Gagang Pintu

37

COBOL

Tentu! "Bahkan monyet bisa melakukan ini!"

Ini adalah program COBOL sederhana yang akan mengurutkan input untuk Anda. Baca komentar untuk melihat seberapa sepele dan extensible itu. Manfaat nyata dari ini adalah bahwa ia dicoba dan mekanisme yang sebenarnya, tidak bergantung pada bahasa yang baru dan relatif belum diuji seperti Java dan apa pun berbasis web atau dari Microsoft. Ini mengkompilasi dengan sangat efektif, dan prosedur seperti ini digunakan oleh perusahaan keuangan paling sukses di Fortune500 dan para pemimpin industri lainnya. Kode ini telah ditinjau oleh banyak ahli dan diakui sebagai mekanisme penyortiran yang sangat baik.

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
Hanya Anda yang akan menggunakan COBOL untuk menjawab pertanyaan ini. +1
syb0rg

5
Ah, aroma segar kartu punch
Sklivvz

3
@EbenezerSklivvze - LOL. Saya pernah mengeluarkan kartu berlubang yang saya gunakan sebagai bookmark ketika profesor perguruan tinggi Majelis saya memberi tahu kelas tentang kartu tinju yang lama. Dia cukup lantai (itu pada tahun 1994 :). Jangan berpikir banyak orang sezaman saya pernah melihat seluruh dek ...
DVK

30

OP tidak pernah mengatakan BAGAIMANA cara menyortirnya ... atau apa definisi rangkapnya. Dengan asumsi tipe data doubletetapi menafsirkannya sebagai duplikat . Menggunakan JavaScript di sini.

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

Hasil: urutan bergantian [4, 11, 4, 9, 5, 7, 6, 7]


4
+ Msgstr "Anggap datatype dobel tetapi menafsirkannya sebagai duplikat". Hanya seorang jenius yang benar-benar akan berpikir seperti itu. Sangat brilian!
Felipe Miosso

@FelipeMiosso Sejujurnya, saya tidak yakin apakah Anda hanya bersikap sarkastik ...
Kiruse

1
Haha ... Saya menjadi sarkastik. Saya tahu ada orang di luar sana yang benar-benar berpikir seperti itu. Pokoknya ... jawaban Anda epik! Saya banyak tertawa.
Felipe Miosso

@FelipeMiosso Senang saya bisa membantu membuat tertawa. ;)
Kiruse

konsol.log semuanya!
Emil Vikström

28

PHP

Berikut ini adalah implementasi penuh dengan penanganan kesalahan. Ini adalah yang tercepat untuk siapa pun 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)));

Permutasi berikutnya dalam C ++ berfungsi dengan mengembalikan true ketika array diurutkan dan false sebaliknya (setelah diizinkan). Jadi Anda seharusnya mengurutkan array dan kemudian menggunakannya dalam do-while seperti di atas (sehingga akan membuat lingkaran penuh kembali ke array yang diurutkan).


+1 Saya berpikir untuk menggunakan next_permutationjawaban saya, tetapi ini jauh lebih bersih daripada yang saya pikirkan.
jliv902

25

[solusi dengan penyesatan yang rumit]

Silakan baca standar yang relevan, IEC 60559: 1989 Spesifikasi untuk aritmetika titik mengambang biner untuk sistem mikroprosesor , yang dapat Anda beli di sini . Dalam catatan kaki ke §5.10 Rincian predikat totalOrder , dicatat bahwa:

totalOrder tidak memaksakan pemesanan total pada semua penyandian dalam format. Secara khusus, itu tidak membedakan antara pengkodean yang berbeda dari representasi floating-point yang sama, seperti ketika satu atau kedua pengkodean non-kanonik.

Jadi kita melihat bahwa tidak mungkin untuk menulis kode untuk mengurutkan ganda. Ini pertanyaan jebakan. Ha, ha, sangat pintar! Tolong beri tahu profesor Anda, saya sangat menikmati kursusnya.

[edit: tidak ada yang mengharuskan saya untuk tidak menganggap bahwa masalah tersebut menuntut pesanan total]


3
Tapi masalahnya adalah mengurutkan ganda. Tidak ada yang membutuhkan nilai dalam urutan (total). Misalnya Anda bisa mengurutkan array menjadi dua, angka positif dan negatif. Anda ragu dengan pertanyaan itu.
shiona

23

JavaScript yang jahat:

OP, saya tidak ingin memberi Anda segalanya jadi saya akan membiarkan Anda mencari cara untuk mendapatkan input dari pengguna sendiri (petunjuk: gunakan prompt).

Setelah Anda memilikinya, inilah fungsi yang bisa Anda gunakan untuk mengurutkannya. Anda hanya perlu memberikan array, nilai terendah dalam array, dan peningkatan:

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

Berikut adalah biola untuk melihatnya beraksi dengan input pengguna contoh [1.5, -3.5, 12, 10, -19.5].


Catatan: Selain berkinerja buruk, rumit, dan tidak dapat dipertanggungjawabkan untuk masalah yang dihadapi, ini akan sangat membuat frustasi jika OP tidak tahu tentang matematika floating point. Misalnya, jika input pengguna adalah [8.1, 5, -.8, 2.3, 5.6, 17.9]dan OP memilih nilai langsung (yaitu minimumVal=-.8dan increment=.1), program akan berjalan selamanya. Pada catatan terkait, saat ini saya bangga memiliki 2 tab browser yang tidak berfungsi karena masalah ini :)

Catatan II: Saya merasa menjijikkan bahkan menulis kode di atas.

Catatan III: MWA HAHAHAHA!


Ide bagus. Anda pasti keren ketika Anda masih pemula pemrograman.
Pierre Arlaud

22

Inilah jawaban aktual yang saya sukai untuk Java:

Tambahkan Baris sebelum println dan array Anda akan diurutkan

Arrays.sort( array );

Tidak ada penjelasan, membingungkan OP , tetapi berfungsi dan akan mendapatkan upvotes dari programmer yang lebih berpengalaman.


Jawaban serupa lainnya :

Lihatlah Arrays.sort ()

Secara tidak langsung mengatakan kepada OP untuk melakukan penelitian sendiri sambil memberinya jawaban yang benar-benar samar. Tanpa penelitian lebih lanjut, OP masih bingung . Saya juga suka bahwa tautannya menunjuk ke dokumentasi yang lebih lama.


10
Ini berguna dan karenanya layak untuk down-vote.
emory

11
"Secara tidak langsung mengatakan kepada OP untuk melakukan penelitian sendiri sambil memberikan jawaban yang benar-benar kabur" cukup banyak menggambarkan gaya saya menjawab StackOverflow: /
Corey Goldberg

7
"Lihatlah Arrays.sort ()" ... "Bisakah saya mendapatkan contoh cara menggunakannya dalam program saya?" ... brilian.
SimonT

5
+1 terutama karena OP kita yang rendah hati mungkin perlu menulis semacam itu sendiri untuk sebuah kelas, membuat Array.sort () benar-benar tidak berguna baginya.
Kevin

2
Ctrl + F -> "Bisakah saya mendapatkan contoh cara menggunakannya dalam program saya?" = 3 hasil.
Qix

21

Algoritma genetik / metode Monte Carlo untuk masalah penyortiran di JAVA

Masalah penyortiran dikenal untuk ilmu komputasi untuk waktu yang lama dan banyak solusi bagus telah ditemukan. Dalam beberapa tahun terakhir telah ada kemajuan besar dalam biocomputing dan melihat bagaimana pemecahan masalah biologi telah terbukti sangat membantu dalam memecahkan masalah-masalah sulit. Algoritma pengurutan ini mengambil yang terbaik dari ide-ide ini untuk menggunakannya untuk menyelesaikan masalah pengurutan. Idenya cukup sederhana. Anda mulai dengan array yang tidak berurutan dan mencari tahu bagaimana ini sudah diurutkan. Anda memberinya skor "pengurutan" dan kemudian mengubah urutan array dengan komponen acak - seperti dalam biologi di mana tidak jelas bagaimana anak-anak akan terlihat seperti bahkan jika Anda tahu semua tentang orang tua! Ini adalah bagian dari algoritma genetika. Anda membuat keturunan array yang bisa dikatakan. Kemudian Anda melihat apakah keturunannya lebih baik disortir daripada induknya (alias survival of the fittest!). Jika ini adalah kasus Anda melanjutkan dengan array baru ini sebagai titik awal untuk membangun permutasi berikutnya dan seterusnya sampai array sepenuhnya diurutkan. Hal yang keren tentang pendekatan ini adalah dibutuhkan lebih pendek, jika array sudah agak diurutkan dari awal!

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

}

Ekstra

  • Penyalahgunaan java.awt.List
  • penamaan variabel tidak konsisten dan buruk
  • benar-benar omong kosong bla bla tentang biocomputing
  • bahasa inventif dan tidak konsisten dalam penjelasan
  • monte carlo jelas merupakan alat yang salah untuk masalah deterministik lurus ke depan
  • impor yang tidak dibutuhkan
  • mungkin lebih banyak barang ...

Apakah memanggil GA atau Monte Carlo ini level lain dari troll? Saya percaya ini adalah algoritma mendaki bukit secara acak.
shiona

mengasosiasikan program ini dengan nama-nama kata kunci itu disengaja, tetapi saya tidak pernah mendengar tentang "algoritma pendakian bukit acak" baik ... dan dalam arti yang lebih luas saya pikir GA dan Monte Carlo tidak terlalu jauh untuk menjadi salah ...
luksch

19

Python

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

Mengurutkan array (daftar) dengan jumlah dari 3 rd dan 5 th tempat desimal.


5
Sayangnya, ini sepele diperbaiki dengan menghapus semuanya setelah lambda x:dan menggantinya dengan x. Namun, seorang programmer pemula tidak akan pernah tahu itu, jadi pujian!
Joe Z.

18

C ++

Ini berhasil ... akhirnya.

Inilah algoritma pengurutan saya:

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

Inilah program lengkapnya:

#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
“Algoritme” semacam Anda membuat saya menangis.
Nate

Hah, itu bukan algoritma karena tidak diberikan untuk menyelesaikan>: D
jmacedo

@ joxnas, sebenarnya pada sistem di mana perangkat acak non-deterministik tidak tersedia, pengacak sebenarnya bisa periodik. Maka itu hanya akan tergantung pada apakah set permutasi yang dimungkinkan diizinkan oleh randomizer mengambil set permutasi yang mungkin $ S_n $ untuk semua panjang array input yang mungkin $ n $.
bug

Ah, saya lupa LaTeX hanya didukung di TeX.SE dan Math.SE. Bayangkan saja simbol-simbol itu dalam italix sombong.
bug

18

Di sini, pesta mata Anda:

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

Sepotong kode ini menampilkan array dan meminta pengguna untuk memasukkan ganda terkecil dari array. Itu kemudian menambahkan nomor ke daftar nomor yang diurutkan, menghapus ganda dari array dan menampilkan nomor array yang tersisa.

* Salah tafsir: Titik lemah, tetapi OP tidak persis mengharapkan program untuk meminta pengguna membantu menyortir.

* Kecurangan: pengguna yang melakukan penyortiran yang sebenarnya.

* Kinerja: Setiap nomor array memerlukan pulang-pergi server, dan itu mengharuskan pengguna untuk menemukan nomor terkecil secara manual. Performa tidak bisa jauh lebih buruk.

* Tidak dapat diterima: Saya pikir saya dapat hal itu. Dan semoga berhasil menggunakannya kembali. Terburuk menjadi yang terburuk, pengguna dapat menyingkirkan 90% kode dan mengulanginya berulang-ulang untuk menemukan nilai terkecil dan menghapusnya setiap kali, yang akan memberinya salah satu algoritma penyortiran yang paling efisien.

* Kreatif dan jahat: Anda memberi tahu saya.


2
Anda mengatakan 'berpesta matamu' dan beri saya PHP Oo
Aidiakapi

3
"Jahat" adalah bagian dari persyaratan, bukan?
Sylverdrag

17

Sortir Desain Cerdas Javascript

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

6
Kredit di mana kredit jatuh tempo: dangermouse.net/esoteric/intelligentdesignsort.html
wchargin

1
Tidak mengerti mengapa Anda menampar desain cerdas dalam kontes pemrograman?
khebbie

12
@khebbie Kenapa tidak?
Konrad Rudolph

Masalahnya adalah, jika pengguna adalah orang yang memasukkan angka, maka mereka akan lebih pintar daripada diri mereka sendiri. ;)
d -_- b

16

Python - req. # 1

Kode ini akan mengurutkan ganda dalam urutan leksikografis daripada meningkatkan urutan numerik, dengan membuat pohon angka awal dan kemudian mengulanginya secara rekursif.

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

Ini bekerja n log ntepat waktu, dan sebenarnya cara yang cerdas untuk menyimpan daftar yang diurutkan sebaliknya, tetapi sayangnya untuk OP, ia melakukan hal yang sepenuhnya salah.


4
Ini juga sangat licik dalam hal jika semua angka memiliki jumlah digit yang sama sebelum titik desimal, itu akan benar-benar bekerja dengan benar, sehingga OP mungkin bahkan tidak menyadari bahwa penyortir melakukan sesuatu yang salah jika ia hanya mengujinya menggunakan input dari , katakan 2, 1, 3, 8, 5,.
Joe Z.

14

Mengurutkan array ganda. Di Jawa:

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

Misalnya:

[0.0, 1.5, 123]

pergi dari representasi biner yang tidak disortir dari

011111111111000000000000000000000000000000000000000000000000000100000001011110110000000000000000000000000000000000000000000000

untuk diurutkan dengan elegan

000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111


11

Saya membutuhkan program di mana pengguna memasukkan array ganda dan program output array diurutkan. Bisakah Anda memberikan kodenya?

Edit per @kealist, saya kira lebih baik jika berkomentar untuk membuat pembagian itu tampak masuk akal. Dalam Rebol ...

doubled-list: load ask "Input list of doubles: "

;-- The list is of doubles, so we have to undouble them before sorting
;-- Use MAP-EACH to create a new list with each element divided by two
undoubled-list: map-each num doubled-list [num / 2] 

;-- Note: We could also have sorted before we undoubled the numbers
print sort undoubled-list

Memainkan gagasan bahwa mereka tidak benar-benar tahu apa itu ganda, dan mungkin percaya daftar ganda hanyalah sekelompok angka dikalikan dua.


6
Mungkin mereka perlu dibelah dua karena input sudah dua kali lipat!
kealis

@kealist Saya menganggap itu, namun ini bermain pada gagasan bahwa "penggandaan" sedang terjadi. Saya pikir itu menyelinap sedikit lebih baik untuk memiliki [2 * num].
Dr. Rebmu

10

Sengaja salah paham pertanyaan:

Menggunakan pendekatan rekursif:

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

Array yang diurutkan dijamin akan dikeluarkan pada titik tertentu, untuk semua jenis data dalam array, bahkan segala jenis urutan penyortiran, dan bahkan segala jenis pemisah untuk input, yang membuat pendekatan ini sangat fleksibel. Kelemahan utamanya adalah agak lambat untuk array besar, tetapi Anda bisa menyelesaikannya dengan mudah dengan multithreading.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.