Ordina un elenco di numeri interi


22

La sfida

È davvero molto semplice, ordina un elenco di numeri.

Dettagli

È necessario ordinare un elenco di numeri in ordine crescente, senza utilizzare alcuna funzione di ordinamento / librerie / etc (ad esempio list.sort()in Python).

L'input / output può essere eseguito con qualsiasi metodo tu scelga, purché sia ​​leggibile dall'uomo.

Le scappatoie standard non sono consentite come sempre.

Vince il codice più breve in byte.

Devi spiegare / elencare quale metodo di ordinamento hai usato (Bubble, Insertion, Selection, ecc.)

L'input non conterrà duplicati.

Ingresso / uscita campione

Ingresso: 99,-2,53,4,67,55,23,43,88,-22,36,45

Produzione: -22,-2,4,23,36,43,45,53,55,67,88,99

Nota: un opposto quasi diretto di Ordina un elenco di numeri


8
Sono molto sorpreso se questo non è un duplicato, ma non ho il tempo di controllare. In ogni caso, le "funzioni di ordinamento integrate" dovrebbero essere meglio definite. Puoi usare una funzione che indicizza tutti i valori? [7 2 4 1] -> [4 2 3 1]. Inoltre, l'elenco CSV può essere racchiuso tra parentesi? Inoltre, il formato di input specifico è molto adatto per alcune lingue e male per altre. Ciò rende l'analisi dell'analisi una parte importante di alcuni invii e non necessaria per altri.
Stewie Griffin,

1
@StewieGriffin Ho visto molte sfide di ordinamento, ma nessuna ha a che fare con l'ordinamento di un semplice elenco di numeri interi. Ci sono molte sfide che sono più facili per alcune lingue e molto più difficili in altre.
Michelfrancis Bustillos,

Questo è molto simile, ma ha una restrizione O (Nlog (N)).
Nathan Merrill

2
Molto strettamente correlato a questa domanda , ma poiché alcune risposte qui (ad es. Il filtro di intervallo di Dennis) richiedono che l'input sia un numero intero, non voterò per chiudere come duplicato.
Peter Taylor,

Rilevante: youtube.com/user/AlgoRythmics/videos - Un canale Youtube che insegna algoritmi di smistamento attraverso balli ungheresi!
sergiol,

Risposte:


23

05AB1E , 2 byte

Codice:

ϧ

Stesso algoritmo della risposta Jelly . Calcola tutte le permutazioni dell'input e ne espone la più piccola.

Provalo online!


Un metodo più efficiente è:

E[ß,Ž

Esegue selezione di ordinamento . Utilizza la codifica CP-1252 .

Provalo online!


6
Accettarlo temporaneamente poiché non vedo nessuno ottenere meno di 2.
Michelfrancis Bustillos,

6
@MichelfrancisBustillos bene, se lo facessero, sarebbe integrato, no?
Limone distruttibile

Ho appena guardato 05AB1E / Base un minuto fa, e poi ho visto questo. Coincidenza?
facepalm42,

17

Gelatina, 3 byte

Œ!Ṃ

Questo genera tutte le permutazioni dell'elenco di input, quindi seleziona la permutazione lessicograficamente più piccola. Molto efficiente.

Ringraziamenti a @Adnan che ha avuto la stessa idea in modo indipendente.

Provalo online!


Gelatina, 4 byte

ṂrṀf

Ciò crea l'intervallo dal minimo dell'elenco al massimo dell'elenco, quindi scarta gli elementi dell'intervallo non presenti nell'elenco originale. Questo è tecnicamente un tipo di secchio , con secchi molto piccoli. Non sono a conoscenza di un nome per questa specifica variante.

Provalo online!

Come funziona

ṂrṀf  Main link. Argument: A (list/comma-separated string)

Ṃ     Compute the minimum of A.
  Ṁ   Compute the maximum of A.
 r    Yield the inclusive range from the minimum to the maximum.
   f  Filter the range by presence in A.

O ( molto ). Usa molto ordinamento.
mbomb007,

22
Quindi O. Molto usa. Molto sorta. Stupire! (Scusa, cosa?)
Dennis,

Non sono bravo con la complessità degli algoritmi, sarebbe O (n!)?
FlipTack,

2
@FlipTack Nemmeno io. Probabilmente un po 'più in alto, dato che ci sono n! matrici di lunghezza n .
Dennis,

1
Basta selezionare il più piccolo lessicograficamente è O (n * n!) Poiché ciascuno dei n! le matrici devono essere confrontate in sequenza e il confronto lessicale è O (n). La generazione può essere eseguita anche in O (n * n!) Se eseguita in modo efficiente, quindi scommetterei che l'algoritmo è solo O (n * n!) Se ben implementato
PunPun1000,

12

Python, 46 45 byte

lambda l:[l.pop(l.index(min(l)))for _ in 1*l]

Ordinamento di selezione semplice.


4
l[:]potrebbe essere1*l
feersum

9

Brachylog , 12 7 byte

p.'(s>)

Questo usa l'ordinamento per permutazione, che è ovviamente terribile, ma ehi è più corto di Pyth!

Spiegazione

p.       Unifies the output with a permutation of the input
  '(  )  True if what's inside the parentheses cannot be proven, else backtrack and
         try with another permutation of the input.
    s    Take an ordered subset from the output
     >   True if the first element is bigger than the second (hence not sorted)
         We don't need to check that the subset is 2 elements long because > will be false
         for inputs that are not 2 elements long anyway

9

Haskell, 38 byte

h%t|(a,b)<-span(<h)t=a++h:b
foldr(%)[]

La funzione binaria %inserisce un nuovo elemento hin un elenco ordinato tpartizionando tin un prefisso adi elementi <he un suffissob di elementi >he si incastra htra loro.

L'operazione foldr(%)[] crea quindi un elenco ordinato da vuoto inserendo ripetutamente elementi dall'elenco di input.

Questo è un byte più corto dell'implementazione diretta ricorsiva

f(h:t)|(a,b)<-span(<h)$f t=a++h:b
f x=x

Un'altra strategia per 41 byte:

f[]=[]
f l|x<-minimum l=x:f(filter(/=x)l)

Quindi questo è en.wikipedia.org/wiki/Insertion_sort , con %come loop interno di inserimento e foldrper applicarlo come loop esterno.
Peter Cordes,

8

JavaScript (ES6), 51 byte

a=>a.map(_=>m=Math.min(...a.filter(e=>e>m)),m=-1/0)

Ogni ciclo trova il numero più piccolo che non è stato trovato finora.


Chiamando questo [1,2,3,4,5,4,3,2,1]produce[1, 2, 3, 4, 5, Infinity, Infinity, Infinity, Infinity]
Benjamin Gruenbaum

@BenjaminGruenbaum "L'input non conterrà duplicati."
Neil,

Ho lo stesso conto esatto con un approccio diverso
Bálint,

In realtà, 1 byte in meno
Bálint,


8

Python 2, 34 byte

def f(s):m=min(s);print m;f(s-{m})

Accetta input come set, stampandone gli elementi in ordine crescente, terminando con errori.

Una terminazione pulita può essere eseguita in 41 byte:

def f(s):
 if s:m=min(s);print m;f(s-{m})

o

l=input()
while l:m=min(l);print m;l-={m}

L'input può essere preso come elenco per 39 byte o 38 byte in Python 3.5:

def f(l):m=min(l);print m;f(set(l)-{m})
def f(l):m=min(l);print(m);f({*l}-{m})

Questo è un en.wikipedia.org/wiki/Selection_sort , usando m=min(s)/ s - (m)come il ciclo interno per trovare e rimuovere il minimo dagli elementi non ordinati e ricorsione come l'esterno.
Peter Cordes,

8

Haskell, 42 41 38 byte

f u=filter(`elem`u)[(minBound::Int)..]

Passa attraverso tutti i numeri interi (con segno a 64 bit, sulla mia macchina) e mantiene quelli presenti u. Ovviamente non finisce in tempo ragionevole.

La versione precedente è stata ripetuta [minimum u..maximum u] la quale ha lo stesso tempo di esecuzione nel caso peggiore.

Modifica: @xnor ha salvato un byte. Grazie!


filterè uno più corto:f u=filter(`elem`u)[minimum u..maximum u]
xnor

Che forza bruta! Non [minimum u..]funziona per motivi di tipo?
xnor

@xnor: penso di si. Quando chiamiamo, diciamo f [1,3,0], per impostazione predefinita gli elementi Integernon sono associati, quindi ..non finisce mai. Se devi chiamarlo come f ([1, 3, 0]::[Int])allora suppongo, l'annotazione di tipo deve essere inclusa nel conteggio dei byte.
nimi,

Come rileva gli elementi che si verificano più di una volta?
feersum

1
@feersum: no, ma la sfida dice: "L'input non conterrà duplicati".
nimi,

8

Oracle SQL 11.2, 205 byte

WITH s AS(SELECT COLUMN_VALUE||''e FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))),v(p,f)AS(SELECT e,e FROM s UNION ALL SELECT p||','||e,e FROM v,s WHERE e+0>f)SELECT p FROM v WHERE LENGTH(p)=LENGTH(:1);         

Un-golfed

WITH 
s AS  -- Split the string using ',' as separator
(     -- ||'' cast the xml type to varchar
  SELECT COLUMN_VALUE||''e FROM XMLTABLE(('"'||REPLACE(:1,',','","')||'"'))
),  
v(p,f) AS  -- Recursive view : p = sorted string, f last number added
(
  SELECT e,e FROM s -- use each number as seed
  UNION ALL         -- only add a number if it is > the last added
  SELECT p||','||e,e FROM v,s WHERE e+0>f  -- +0 is needed to compare int and not strings
)  
-- The valid string has the same length as the input
SELECT p FROM v WHERE LENGTH(p)=LENGTH(:1)          

Per quanto riguarda quale sia il metodo di ordinamento, non ne ho idea, mi sono ORDER BYassicurato di averli dimenticati.


Conosco a malapena SQL, ma dai tuoi commenti penso che tu stia selezionando il minimo o il massimo dagli elementi non ordinati rimanenti e lo aggiungi alla fine di un elenco ordinato. Questo lo rende un en.wikipedia.org/wiki/Selection_sort .
Peter Cordes,

8

codice macchina x86-16 (BubbleSort int8_t), 20 19 byte

codice macchina x86-64 / 32 (JumpDownSort) 21 19 byte

changelog:

  • Grazie a @ ped7g per l' idea lodsb/ cmp [si],ale mettendo insieme un incremento / reset del puntatore che stavo guardando. Non necessario al/ah serve ci permette di usare quasi lo stesso codice per numeri interi più grandi.

  • Nuovo algoritmo (ma correlato), molte modifiche all'implementazione: Bubbly SelectionSort consente un'implementazione x86-64 più piccola per byte o password; break-even su x86-16 (byte o parole). Evita anche il bug su size = 1 del mio BubbleSort. Vedi sotto.

  • Si scopre che il mio ordinamento di selezione frizzante con swap ogni volta che trovi un nuovo min è già un algoritmo noto, JumpDown Sort. È menzionato in Bubble Sort: An Archaeological Algorithmic Analysis (ovvero come ha fatto Bubble Sort a diventare popolare nonostante il succhiare).


Ordina sul posto gli interi con segno a 8 bit . (Unsigned ha le stesse dimensioni del codice, basta cambiare jgein a jae). I duplicati non sono un problema. Scambiamo usando una rotazione di 16 bit di 8 (con una destinazione di memoria).

Bubble Sort fa schifo per le prestazioni , ma ho letto che è uno dei più piccoli da implementare nel codice macchina. Questo sembra particolarmente vero quando ci sono trucchi speciali per scambiare elementi adiacenti. Questo è praticamente il suo unico vantaggio, ma a volte (nei sistemi embedded nella vita reale) è abbastanza vantaggio per usarlo per elenchi molto brevi.

Ho omesso la risoluzione anticipata senza swap . Ho usato il ciclo BubbleSort "ottimizzato" di Wikipedia che evita di guardare gli ultimi n − 1elementi quando corro pern nona volta, quindi il contatore del loop esterno è il limite superiore per il loop interno.

Elenco NASM ( nasm -l /dev/stdout) o semplice fonte

 2 address  16-bit       bubblesort16_v2:
 3          machine      ;; inputs: pointer in ds:si,  size in in cx
 4          code         ;; requires: DF=0  (cld)
 5          bytes        ;; clobbers: al, cx=0
 6                       
 7 00000000 49               dec     cx          ; cx = max valid index.  (Inner loop stops 1 before cx, because it loads i and i+1).
 8                       .outer:                 ; do{
 9 00000001 51               push    cx          ;   cx = inner loop counter = i=max_unsorted_idx
10                       .inner:                 ;   do{
11 00000002 AC               lodsb               ;     al = *p++
12 00000003 3804             cmp     [si],al     ;     compare with *p (new one)
13 00000005 7D04             jge     .noswap
14 00000007 C144FF08         rol     word [si-1], 8    ; swap
15                       .noswap:
16 0000000B E2F5             loop    .inner      ;   } while(i < size);
17 0000000D 59               pop     cx          ;  cx = outer loop counter
18 0000000E 29CE             sub     si,cx       ;  reset pointer to start of array
19 00000010 E2EF             loop    .outer      ; } while(--size);
20 00000012 C3               ret

22 00000013  size = 0x13 = 19 bytes.

push / pop di cx attorno al ciclo interno significa che funziona con cx= outer_cx fino a 0.

Nota che rol r/m16, imm8 non è un'istruzione 8086, è stata aggiunta in seguito (186 o 286), ma questo non sta cercando di essere codice 8086, solo x86 a 16 bit. Se SSE4.1 phminposuwfosse d'aiuto, lo userei.

Una versione a 32 bit di questo (ancora funzionante su numeri interi a 8 bit ma con puntatori / contatori a 32 bit) è di 20 byte (prefisso di dimensione dell'operando su rol word [esi-1], 8 )

Bug: size = 1 viene trattato come size = 65536, perché nulla ci impedisce di entrare nel do esterno / mentre con cx = 0. (Normalmente lo jcxzuseresti per quello.) Ma per fortuna il JumpDown Sort a 19 byte è di 19 byte e non ha questo problema.


Versione originale x86-16 20 byte (senza l'idea di Ped7g). Omesso per risparmiare spazio, vedere la cronologia delle modifiche con una descrizione.


Prestazione

Store / ricaricare parzialmente sovrapposti (ruotando la destinazione della memoria) provoca uno stallo di inoltro del negozio su moderne CPU x86 (tranne Atom in ordine). Quando un valore elevato gorgoglia verso l'alto, questa latenza aggiuntiva fa parte di una catena di dipendenze trasportata da loop. Conservare / ricaricare fa schifo in primo luogo (come la latenza di inoltro del magazzino a 5 cicli su Haswell), ma una stalla di inoltro lo porta a più di 13 cicli. L'esecuzione fuori ordine avrà difficoltà a nasconderlo.

Vedi anche: Stack Overflow: ordinamento a bolle per l'ordinamento della stringa per una versione di questo con un'implementazione simile, ma con un inizio anticipato quando non sono necessari scambi. Utilizza xchg al, ah/ mov [si], axper lo scambio, che è più lungo di 1 byte e provoca uno stallo del registro parziale su alcune CPU. (Ma potrebbe comunque essere meglio di memory-dst rotate, che deve caricare nuovamente il valore). Il mio commento ha alcuni suggerimenti ...


x86-64 / x86-32 Ordinamento JumpDown, 19 byte (ordina int32_t)

Richiamabile da C utilizzando la convenzione di chiamata System V x86-64 come
int bubblyselectionsort_int32(int dummy, int *array, int dummy, unsigned long size); (valore di ritorno = max (array [])).

Questo è https://en.wikipedia.org/wiki/Selection_sort , ma invece di ricordare la posizione dell'elemento min, scambiare il candidato corrente nella matrice . Dopo aver trovato il minimo (unsorted_region), memorizzalo alla fine della regione ordinata, come il normale ordinamento per selezione. Questo aumenta la regione ordinata di uno. (Nel codice, rsipunta a uno oltre la fine della regione ordinata; lo fa lodsdavanzare e mov [rsi-4], eaxmemorizza il min al suo interno.)

Il nome Jump Down Sort è utilizzato in Bubble Sort: An Archaeological Algorithmic Analysis . Immagino che il mio tipo sia davvero un tipo Jump Up, perché gli elementi alti saltano verso l'alto, lasciando il fondo ordinato, non la fine.

Questo design di scambio porta alla parte non ordinata dell'array che finisce in un ordine per lo più in ordine inverso, portando a molti swap in seguito. (Perché inizi con un grande candidato e continui a vedere candidati sempre più bassi, quindi continui a scambiarti.) L'ho chiamato "frizzante" anche se sposta gli elementi nella direzione opposta. Il modo in cui sposta gli elementi è anche un po 'come una sorta di inserzione all'indietro. Per vederlo in azione, usa GDB display (int[12])buf, imposta un punto di interruzione sull'istruzione interna loope usa c(continua). Premi Invio per ripetere. (Il comando "display" consente a GDB di stampare l'intero stato dell'array ogni volta che raggiungiamo il punto di interruzione).

xchgcon mem ha un lockprefisso implicito che rende questo extra lento. Probabilmente circa un ordine di grandezza più lento di uno scambio carico / magazzino efficiente; xchg m,rè uno per 23c throughput su Skylake, ma caricare / memorizzare / mov con un tmp reg per uno scambio efficiente (reg, mem) può spostare un elemento per clock. Potrebbe essere un rapporto peggiore su una CPU AMD in cui le loopistruzioni sono veloci e non rallenterebbero troppo il ciclo interno, ma i fallimenti del ramo saranno comunque un grosso collo di bottiglia perché gli swap sono comuni (e diventano più comuni quando la regione non ordinata si riduce ).

 2 Address               ;; hybrib Bubble Selection sort
 3        machine         bubblyselectionsort_int32:   ;; working, 19 bytes.  Same size for int32 or int8
 4        code               ;; input: pointer in rsi, count in rcx
 5        bytes              ;; returns: eax = max
 6                       
 7                           ;dec  ecx           ; we avoid this by doing edi=esi *before* lodsb, so we do redundant compares
 8                                               ; This lets us (re)enter the inner loop even for 1 element remaining.
 9                       .outer:
10                           ; rsi pointing at the element that will receive min([rsi]..[rsi+rcx])
11 00000000 56               push   rsi
12 00000001 5F               pop    rdi
13                           ;mov    edi, esi     ; rdi = min-search pointer
14 00000002 AD               lodsd
16 00000003 51               push   rcx          ; rcx = inner counter
17                       .inner:                   ; do {
18                           ; rdi points at next element to check
19                           ; eax = candidate min
20 00000004 AF               scasd                 ; cmp eax, [rdi++]
21 00000005 7E03             jle  .notmin
22 00000007 8747FC           xchg   [rdi-4], eax   ; exchange with new min.
23                         .notmin:
24 0000000A E2F8             loop  .inner          ; } while(--inner);
26                           ; swap min-position with sorted position
27                           ; eax = min.  If it's not [rsi-4], then [rsi-4] was exchanged into the array somewhere
28 0000000C 8946FC           mov    [rsi-4], eax
29 0000000F 59               pop   rcx           ; rcx = outer loop counter = unsorted elements left
30 00000010 E2EE             loop  .outer        ; } while(--unsorted);
32 00000012 C3               ret

34 00000013 13           .size: db $ - bubblyselectionsort_int32
           0x13 = 19 bytes long

Dimensioni del codice stesso per int8_t: utilizzo lodsb/ scasb, ALe modificare l' [rsi/rdi-4]a-1 . Lo stesso codice macchina funziona in modalità 32 bit per elementi a 8/32 bit. La modalità a 16 bit per gli elementi a 8/16 bit deve essere ricostruita con gli offset modificati (e le modalità di indirizzamento a 16 bit utilizzano una codifica diversa). Ma ancora 19 byte per tutti.

Evita l'inizializzazione dec ecxconfrontandola con l'elemento appena caricato prima di proseguire. Nell'ultima iterazione del ciclo esterno, carica l'ultimo elemento, controlla se è inferiore a se stesso, quindi viene eseguito. Questo gli permette di lavorare con size = 1, dove il mio BubbleSort fallisce (lo tratta come size = 65536).

Ho provato questa versione (in GDB) usando questo chiamante: provalo online! . Puoi eseguirlo su TIO, ma ovviamente nessun debugger o stampa. Tuttavia, quello _startche lo chiama esce con exit-status = più grande elemento = 99, quindi puoi vedere che funziona.


Potrebbe esserci spazio per migliorare la condizione del circuito interno, sembra che stia usando molti byte. Forse push / pop cxe utilizzare loopper entrambi? Forse esegui il ciclo contrario, dalla parte posteriore alla parte anteriore dell'array, quindi contiamo un indice fino a zero? (E incrementare bxperché la parte ordinata è alla fine verso cui ci si sposta).
Peter Cordes,

1
Sono arrivato a 19B, ma con molte modifiche, anche input reg (alcuni cambiamenti probabilmente non erano necessari, ma mentre stavo giocando in giro, sono rimasti lì da esperimenti precedenti) ... è ancora basato sul tuo lavoro, quindi riluttante a pubblicare come risposta, puoi controllarlo su pastebin: pastebin.com/0VMzdUjj
Ped7g

@ Ped7g: Nice! Avevo considerato sub si, cxcome parte del ciclo esterno usando un puntatore invece di indicizzare, ma non avevo pensato a lodsb/ cmp [si], al. Avevo preso in considerazione lodsw/ dec si, o lodsb/ xchg al,ahancora per prepararmi percmp ah,al
Peter Cordes il

@ Ped7g: oh, la tua versione richiede cld, o immagino che potremmo fare quella parte della convention di chiamata. AFAIK, avendo DFeliminato non è una parte standard delle convenzioni di chiamata a 16 bit, solo 32/64. O è solo che non puoi assumerlo in un bootloader? Ma con una convenzione di chiamata del registro personalizzata, si tratta tanto di un frammento di codice quanto di una funzione, quindi certo, perché non richiedere DF = 0. (E se vogliamo, ES = DS, così potremmo scasbinvece lodsbche se fosse più conveniente.)
Peter Cordes,

1
@ Ped7g: non ho idea delle convenzioni a 16 bit, tutto quello che so è che non puoi sempre presumere che DF sia stato cancellato. Ma penso che sia principalmente in un contesto di bootloader. Non ho mai eseguito nulla di ciò che ho scritto su DOS reale. Ero su Atari Mega 4 STe (68000/68020), poi su Linux (su un Pentium MMX), quindi sono riuscito a evitare del tutto x86 a 16 bit fino a quando le domande SO non me lo hanno speronato in gola.
Peter Cordes,

6

C, 72 byte

i,j;a(int*l,int n){for(i=0;i=i?:--n;j>l[n]?l[i]=l[n],l[n]=j:0)j=l[--i];}

Bubblesort. Il primo argomento è un puntatore alla matrice, il secondo argomento è la lunghezza della matrice. Funziona con gcc.


Questo ha davvero bisogno di una versione non golfata per essere leggibile; è davvero difficile tenere traccia di dove gli operatori ternari iniziano / finiscono.
Peter Cordes,

5

MATL , 11 10 byte

Y@t!d0>AY)

Esame estremamente inefficiente di tutte le permutazioni dell'input.

Provalo online!

Spiegazione

        % Implicitly grab input array
Y@      % Compute all permutations (each permutation as a row)
t       % Duplicate this matrix
!d      % Transpose and take the differences between the values
0>A     % Find the rows where all differences are > 0
Y)      % Return only the row where this is true
        % Implicitly display the result

5

Rubino, 40 byte

Ordinamento di selezione. Funzione anonima; prende l'elenco come argomento.

->a{r=[];r<<a.delete(a.min)while[]!=a;r}

4

Python, 120 byte

def f(a):import time,threading;[threading.Thread(None,lambda b=b,c=min(a):print(time.sleep(b-c)or b)).start()for b in a]

Questa probabilmente non sarà la risposta più breve ma mi sembra che questo algoritmo appartenga qui. chiama con un elenco di numeri interi, verranno stampati in modo ordinato su stdout. Non lo proverei con numeri troppo grandi però.


Bel primo post! E bel nome utente. : P
Rɪᴋᴇʀ

4

MIPS, 68 byte

Qualche tempo fa ho scritto una semplice implementazione non ottimizzata di ordinamento delle bolle. Il conteggio dei byte inizia alle loope termina alle li $v0, 10, supponendo che l'indirizzo e la lunghezza dell'elenco siano già in memoria.

 Address    Code        Basic                     Source

0x00400000  0x3c011001  lui $1,4097           5    main:   la      $s0, list       # List address
0x00400004  0x34300000  ori $16,$1,0               
0x00400008  0x2411000a  addiu $17,$0,10       6            li      $s1, 10         # List length
0x0040000c  0x24080000  addiu $8,$0,0         8    loop:   li      $t0, 0          # swapped
0x00400010  0x24090001  addiu $9,$0,1         9            li      $t1, 1          # for loop "i"
0x00400014  0x1131000b  beq $9,$17,11         11   for:    beq     $t1, $s1, fend  # break if i==length
0x00400018  0x00095080  sll $10,$9,2          13           sll     $t2, $t1, 2     # Temp index, multiply by 4
0x0040001c  0x01505020  add $10,$10,$16       14           add     $t2, $t2, $s0   # Combined address
0x00400020  0x8d4b0000  lw $11,0($10)         15           lw      $t3, 0($t2)     # list[i]
0x00400024  0x8d4cfffc  lw $12,-4($10)        16           lw      $t4, -4($t2)    # list[i-1]
0x00400028  0x21290001  addi $9,$9,1          18           addi    $t1, $t1, 1     # i++
0x0040002c  0x016c082a  slt $1,$11,$12        20           ble     $t4, $t3, for   # if list[i-1] > list[i]
0x00400030  0x1020fff8  beq $1,$0,-8               
0x00400034  0xad4bfffc  sw $11,-4($10)        21           sw      $t3, -4($t2)    # swap and store
0x00400038  0xad4c0000  sw $12,0($10)         22           sw      $t4, 0($t2)     
0x0040003c  0x24080001  addiu $8,$0,1         23           li      $t0, 1          # swapped=true
0x00400040  0x08100005  j 0x00400014          24           j       for
0x00400044  0x20010001  addi $1,$0,1          26   fend:   subi    $s1, $s1, 1     # length--
0x00400048  0x02218822  sub $17,$17,$1             
0x0040004c  0x1500ffef  bne $8,$0,-17         27           bnez    $t0, loop       # Repeat if swapped==true
0x00400050  0x2402000a  addiu $2,$0,10        29           li      $v0, 10        
0x00400054  0x0000000c  syscall               30           syscall

Ora aspetto di essere spazzato via dall'acqua con x86 ...


1
È possibile tralasciare il controllo swapped=trueanticipato e il conto alla rovescia in base alle dimensioni dell'array. Vedi la mia versione x86-16 di 20 byte che ordina i numeri interi a 8 bit . Potrei creare una normale versione x86 a 32 o 64 bit che ordina i numeri interi a 32 bit ad un certo punto, ma i numeri interi a 8 bit in modalità 16 bit sono una specie di punto debole per x86.
Peter Cordes,

4

Awk, 66 byte

{b=$0;a[b]}m<b{m=b}n>b{n=b}END{for(i=n;i<=m;i++)if(i in a)print i}

Le matrici in awk sono come dizionari, non come matrici C. Gli indici possono essere non contigui e crescono (e vengono creati) secondo necessità. Quindi, creiamo un array aper l'input, con ogni riga come chiave. E salviamo i valori minimo e massimo. Quindi eseguiamo il ciclo da min a max e stampiamo tutte le chiavi esistenti a. bè solo per evitare un uso ripetuto di $0.


4

Python 3, 91 62 47 byte

def f(z):
 while z:m=min(z);z.remove(m);yield m

Grazie a wnnmaw e Seeq per l'aiuto del golf.

L'argomento zdovrebbe essere un elenco. Questa è una variante del tipo di selezione.

Non sono sicuro di come si minscontri contro built-in sorting functions, dal momento che non sono sicuro di come Python implementa min. Speriamo che questa soluzione sia ancora a posto. Eventuali suggerimenti sul golf nei commenti o nella chat PPCG sono i benvenuti.


Assicurati di indicare quale tipo di ordinamento stai utilizzando.
Michelfrancis Bustillos,

@MichelfrancisBustillos Ho sinceramente dimenticato quale algoritmo sia. Potrebbe essere un ordinamento per selezione?
Sherlock9,

1
Solo per curiosità, perché non semplicemente prendere un elenco direttamente? La domanda consente un formato di input aperto
wnnmaw,

1
@wnnmaw Dang it, ne ho scritto uno ma ho dimenticato di pubblicarlo. Grazie per il promemoria: D
Sherlock9

Hmm, forsedef f(z):\nwhile z:m=min(z);z.remove(m);yield m
seequ

4

MATL , 11 byte

`t4#X<2#)tn

Provalo online!

Questo ordina secondo la seguente procedura, che è O ( n 2 ):

  1. Prendi il minimo dell'array.
  2. Rimuovere quel valore dall'array e memorizzarlo per la visualizzazione successiva.
  3. Applicare la stessa procedura con il resto dell'array, fino a quando non diventa vuoto.
  4. Visualizza tutti i numeri nell'ordine in cui sono stati ottenuti.

MATL è basato su stack. L'array con i valori rimanenti viene mantenuto nella parte superiore dello stack. I valori rimossi sono di seguito, in ordine. Alla fine del programma vengono visualizzati tutti quei valori. Verrà visualizzato anche l'array in alto, ma poiché è vuoto non viene mostrato.

`        % Do...while loop
  t      %   Duplicate. Implicitly take input in the first iteration
  4#X<   %   Compute index of mininum of the array
  2#)    %   Push the minimum, and then the array with remaining entries
  tn     %   Duplicate and push number of elements, to be used as loop condition
         % Implicitly end do...while loop
         % Implicitly display stack contents

3

Pyth - 15 13 11 10 byte

Due byte salvati grazie a @Jakube.

Stupid Sort.

f!s>VTtT.p

Provalo online qui .

Non ho bisogno del perché non hci sono garantiti duplicati.


@Jakube Mi sento stupido, grazie.
Maltysen,

@Suever come ho detto nella mia risposta, non sono garantiti duplicati come da OP.
Maltysen,

Mi dispiace per quello! Perso quel punto.
Suever,

3

Scherzi a parte, 6 byte

,;l@╨m

Provalo online!

Questo fa la stessa cosa di molte altre risposte: genera tutte le permutazioni, seleziona il minimo. Ho dimenticato che avrebbe funzionato mentre stavo lavorando alla soluzione di seguito.

Spiegazione:

,;l@╨m
,;l@    push len(input), input
    ╨m  minimum permutation

Scherzi a parte, 25 byte (non concorrenti)

Questo sarebbe competitivo se non fosse per un bug nel comando shuffle che ho appena risolto.

,1WX╚;;pX@dXZ`i@-0<`MπYWX

Provalo online! Questo implementa il miglior algoritmo di ordinamento di sempre: Bogosort !

Spiegazione:

,1WX╚;;pX@dXZ`i@-0<`MπYWX
,                          get input
 1W                    WX  do-while:
   X                         discard
    ╚                        shuffle
     ;;                      dupe twice
       pX@dX                 remove first element of first dupe and last element of second dupe
            Z                zip
             `i@-0<`MπY      test if all differences are positive (if any are not, the list is not sorted), negate (1 if not sorted else 0)

3

MATL, 17 16 byte

Salvato un byte creando un array nullo grazie a @LuisMendo

vTbtX<-QI$(f8M+q

Ordinamento della benna. Non provarlo con un intervallo superiore a 2 31 -1.

Provalo online!

Spiegazione

v                  % push an empty array
 T                 % push 1
  b                % bubble the input array up to the top of the stack
   t               % duplicate it
    X<             % find the minimum
      -            % subtract min from input array
       Q           % and increment to adjust for 1-based indexing
        I$(        % resulting array used as indices of empty array 
                   % (the [] way up at the top) that are assigned 1 (from T)
           f       % find the nonzero indices
            8M     % magically retrieve the 4th previous function input :/
                     (aka, the min input array value)
              +    % add it to the indices
               q   % and decrement

TIL:

  • Puoi inizializzare un array vuoto in MATL utilizzandolo []e crescendolo, proprio come in MATLAB
  • Come utilizzare (per l'indicizzazione delle assegnazioni
  • Come usare il M appunti automatici

Nuovo giorno, nuovo TIL:

  • vertcat crea magicamente un array vuoto quando non c'è nulla nello stack da concatenare

Aggiungi al tuo TIL: un'iniziale [] può essere sostituita da v. Questo perché il numero predefinito di input di vè il numero di elementi nello stack
Luis Mendo,

@LuisMendo Sooo ... se c'è uno array nello stack ...? Indagare.
becher

Quindi non fa nulla. Pensalo comevertcat(STACK{:})
Luis Mendo il


3

R, 68 byte

Accetta input ie output oche è l'elenco ordinato.

o<-i
for(j in 1:length(i)){
x<-(i-min(i))==0
o[j]<-i[x]
i<-i[!x]
}
o

Spiegazione:

o<-i                      # Defines output as o
 for(j in 1:length(i)){   # Initializes loop for length of input
  x<-(i-min(i))==0        # Generates logical vector by finding the value 0 
                          # of input less the minimum of input. 
   o[j]<-i[x]             # Puts the smallest value at position j
    i<-i[!x]              # Removes the smallest value from input
      }                   # Ends loop
       o                  # Returns sorted list

Evitare le permutazioni significa che può ordinare elenchi di grandi dimensioni in modo relativamente rapido. Il "trucco" è che sottraendo il valore più piccolo dall'input si lascia un singolo 0 che determina sia il valore più piccolo sia la posizione del valore più piccolo.


3

Java 8, 112 92 byte

Ecco un altro tipo di selezione. L'input è un numero List tintero e l'output ordinato viene stampato allo standard out.

t->{for(;0<t.size();System.out.println(t.remove(t.indexOf(java.util.Collections.min(t)))));}

Aggiornare

  • -20 [16-08-21] Usato un lambda

Ciao non lineare, e benvenuto in PPCG!
isaacg,

Benvenuto in Programmazione di puzzle e codice golf! Sembra che il tuo codice presupponga l' tesistenza di una variabile , il che la rende uno snippet; richiediamo che gli invii siano programmi o funzioni completi che utilizzano i nostri formati I / O predefiniti . Richiediamo inoltre importazioni per tener conto del conteggio dei byte. Fatemi sapere se avete domande!
Alex A.

Grazie per le risorse! Ho modificato la mia risposta per essere una funzione e per includere l'importazione.
NonlinearFruit

2

Retina, 95

Ordinamento delle bolle modificato. Ho il sospetto che ci siano modi molto migliori per farlo, anche senza l'ordinamento retina incorporato.

-\d+
$*n
\d+
$*11
+`(1+) (n+)
$2 $1
+`\b(n+) (\1n+)|(1+)(1+) \3\b
$2$3 $1$3$4
1(1*)
$.1
n+
-$.&
  • Fase 1: converti interi -ve in unari con n come cifra; lascia cadere i -segni.
  • Fase 2: converti + ve e zero interi in unari con 1come cifra; aggiungere 1a ciascuno, in modo che zero sia rappresentato da1 .
  • Fase 3: sposta tutti gli alluci in avanti.
  • Fase 4 - Ordinamento: sposta tutti -ves con la magnitudine più grande (cioè il numero più piccolo) davanti a -ves più alti. Sposta + ves più piccoli davanti a + ves più grandi.
  • Fase 5: rimuovi 1 da e converti + ve unari in decimale.
  • Fase 6: riconvertire -ve unari in decimale, incluso il segno.

Provalo online.



@LeakyNun che non ordina l'ultimo elemento nell'elenco.
mbomb007,

@ mbomb007 giusto, non importa.
Leaky Nun,

2

Rubino, 22 byte

Una sorta di permutazione rapida . Funziona nello spazio e nel tempo O (n!).

->a{a.permutation.min}

2

Clojure, 73 35 byte

Bogosort :)

#(if(apply < %)%(recur(shuffle %)))

Versione precedente:

#(reduce(fn[r i](let[[a b](split-with(partial > i)r)](concat a[i]b)))[]%)

Riduce a un elenco ordinato rsuddividendolo in parti "più piccole di i" e "più grandi di i". Immagino che questo sia il tipo di inserzione .


Bello! Non sapevo che potessi recursvolgere una funzione anonima. Inoltre non lo sapevo shuffle.
Matias Bjarland,

2

Rubino, 26 24 byte

Ordinamento della selezione, simile alla risposta di Value Ink, ma utilizzando un approccio diverso per una maggiore giocosità.

Secondo le specifiche: "L'input / output può essere eseguito con qualsiasi metodo tu scelga, purché sia ​​leggibile dall'uomo". Penso che questo si adatti alla descrizione, l'output è una matrice di array con un singolo elemento.

->l{l.map{l-l-=[l.min]}}

esempio:

->l{l.map{l-l-=[l.min]}}[[2,4,3,1]]
=> [[1], [2], [3], [4]]

2

Java 7, 106 104 byte

void a(int[]a){for(int b=a.length-1,d=0,c=0,e;d<b*b;c=++d%b)if(a[c]>a[c+1]){e=a[c];a[c++]=a[c];a[c]=e;}}

Ecco un buon tipo di bolla oleosa. Il parametro della funzione viene modificato in posizione, quindi non devo restituire nulla. Sto ancora cercando di estrarre alcuni byte da questo in modo da poter battere il java lambda che qualcuno ha pubblicato.

-1 byte grazie a Geobits per aver sottolineato che il normale scambio batte xor'ing
-1 byte grazie a Leaky Nun per aver sottolineato che posso spostare tutte le dichiarazioni int nel for-loop

Provalo online!


2

Rubino, 22 byte

->a{[*a.min..a.max]&a}

Crea un array fuori dall'intervallo tra gli elementi minimo e massimo dell'array di input. Restituisce l'intersezione tra le due matrici.


Immagino che sia una specie di en.wikipedia.org/wiki/Counting_sort .
Peter Cordes,

@PeterCordes Quello era un po 'il punto
dkudriavtsev il

La domanda ti chiede di descrivere che tipo di ordinamento è, quindi ho pensato che fosse utile collegarsi al noto algoritmo, oltre a descrivere ciò che effettivamente fa.
Peter Cordes,

Vero. Grazie @PeterCordes
dkudriavtsev il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.