เรียงลำดับรายการเลขจำนวนเต็ม


22

ความท้าทาย

มันค่อนข้างง่ายจริงๆเรียงลำดับรายการหมายเลข

รายละเอียด

คุณต้องเรียงลำดับรายการตัวเลขตามลำดับจากน้อยไปมากโดยไม่ต้องใช้ฟังก์ชั่นการเรียงลำดับ / ไลบรารี / ฯลฯ ในตัว (เช่นlist.sort()ใน Python)

อินพุต / เอาท์พุตสามารถทำได้ทุกวิธีที่คุณเลือกตราบใดที่มนุษย์สามารถอ่านได้

ช่องโหว่มาตรฐานไม่อนุญาตเช่นเคย

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คุณต้องอธิบาย / แสดงรายการวิธีการเรียงลำดับที่คุณใช้ (ฟองการแทรกการเลือก ฯลฯ )

ข้อมูลที่ป้อนจะไม่มีข้อมูลซ้ำซ้อน

ตัวอย่างอินพุต / เอาต์พุต

การป้อนข้อมูล: 99,-2,53,4,67,55,23,43,88,-22,36,45

เอาท์พุท: -22,-2,4,23,36,43,45,53,55,67,88,99

หมายเหตุ: ใกล้ตรงข้ามกับเรียงลำดับรายการของตัวเลข


8
ฉันประหลาดใจมากถ้าสิ่งนี้ไม่ได้ซ้ำกัน แต่ฉันไม่มีเวลาตรวจสอบ อย่างไรก็ตาม "ฟังก์ชั่นการเรียงลำดับในตัว" ควรกำหนดได้ดีกว่า คุณสามารถใช้ฟังก์ชั่นที่สร้างดัชนีค่าทั้งหมดได้หรือไม่? [7 2 4 1] -> [4 2 3 1]. นอกจากนี้รายการ CSV สามารถอยู่ในเครื่องหมายวงเล็บได้หรือไม่ นอกจากนี้รูปแบบการป้อนข้อมูลเฉพาะนั้นเหมาะสมมากสำหรับบางภาษาและไม่ดีสำหรับผู้อื่น สิ่งนี้ทำให้การแยกวิเคราะห์เป็นส่วนสำคัญสำหรับการส่งบางส่วนและไม่จำเป็นสำหรับผู้อื่น
Stewie Griffin

1
@StewieGriffin ฉันเคยเห็นความท้าทายในการเรียงลำดับมากมาย แต่ไม่มีใครจัดการกับการเรียงลำดับเพียงรายการจำนวนเต็มพื้นฐาน มีความท้าทายมากมายที่ง่ายขึ้นสำหรับบางภาษาและยากยิ่งขึ้นสำหรับผู้อื่น
Michelfrancis Bustillos

นี้เป็นอย่างมากที่คล้ายกัน แต่มีโอ (NLog (N)) ข้อ จำกัด
นาธานเมอร์ริลล์

2
มีความเกี่ยวข้องกับคำถามนี้อย่างมากแต่เนื่องจากมีคำตอบบางอย่างที่นี่ (เช่นการกรองช่วงของเดนนิส) จำเป็นต้องใช้อินพุตเป็นจำนวนเต็มฉันจะไม่ลงคะแนนเพื่อปิดเป็นล่อลวง
Peter Taylor

ที่เกี่ยวข้อง: youtube.com/user/AlgoRythmics/videos - ช่อง Youtube ที่สอนการเรียงลำดับอัลกอริทึมผ่านการเต้นรำฮังการี!
sergiol

คำตอบ:


23

05AB1E , 2 ไบต์

รหัส:

ϧ

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

ลองออนไลน์!


วิธีที่มีประสิทธิภาพมากขึ้นคือ:

E[ß,Ž

ดำเนินการจัดเรียงตัวเลือก ใช้การเข้ารหัสCP-1252

ลองออนไลน์!


6
ยอมรับสิ่งนี้เป็นการชั่วคราวเนื่องจากฉันไม่เห็นคนที่ได้รับน้อยกว่า 2
Michelfrancis Bustillos

6
@MichelfrancisBustillos ดีถ้าพวกเขาทำมันจะเป็นแบบบิลท์ใช่มั้ย
มะนาวที่ถูกทำลายได้

ฉันเพิ่งดูที่ 05AB1E / Base เมื่อนาทีที่แล้วจากนั้นฉันดูที่นี้ บังเอิญ?
facepalm42

17

เยลลี่ 3 ไบต์

Œ!Ṃ

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

ให้เครดิตแก่ @Adnan ที่มีความคิดเดียวกันโดยอิสระ

ลองออนไลน์!


เยลลี่ขนาด 4 ไบต์

ṂrṀf

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

ลองออนไลน์!

มันทำงานอย่างไร

Ṃ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 ( มาก ) ใช้เรียงลำดับมาก
mbomb007

22
ดังนั้น O. ใช้ประโยชน์อย่างมาก เรียงลำดับมาก ตะลึงพรึงเพริด! (ขออภัยอะไรนะ?)
เดนนิส

ฉันไม่เก่งเรื่องความซับซ้อนของอัลกอริธึมนี่จะเป็น O (n!) หรือไม่
FlipTack

2
@FlipTack ทั้งฉันก็อาจสูงขึ้นเล็กน้อยเนื่องจากมีn! อาร์เรย์ของความยาวn
Dennis

1
เพียงเลือกพจนานุกรมที่เล็กที่สุดคือ O (n * n!) ตั้งแต่แต่ละ n! อาร์เรย์ต้องถูกเปรียบเทียบตามลำดับและการเปรียบเทียบโดยย่อคือ O (n) การสร้างสามารถทำได้ใน O (n * n!) เช่นกันหากทำได้อย่างมีประสิทธิภาพดังนั้นฉันจึงคิดว่าอัลกอริทึมเป็นเพียง O (n * n!) หากนำไปใช้อย่างดี
PunPun1000

12

Python 46 46ไบต์

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

เรียงลำดับการเลือกง่าย


4
l[:]อาจจะเป็น1*l
feersum

9

Brachylog , 12 7 ไบต์

p.'(s>)

วิธีนี้ใช้การเรียงลำดับการเรียงสับเปลี่ยนซึ่งค่อนข้างแย่ แต่มันสั้นกว่า Pyth!

คำอธิบาย

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 ไบต์

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

ฟังก์ชั่นไบนารี%แทรกองค์ประกอบใหม่hลงในรายการเรียงลำดับtโดยการแบ่งtเป็นคำนำหน้าaขององค์ประกอบ<hและคำต่อท้ายbขององค์ประกอบ>hและเกาะติดhระหว่างพวกเขา

foldr(%)[]จากนั้นการดำเนินการจะสร้างรายการที่เรียงลำดับจากที่ว่างโดยการแทรกองค์ประกอบจากรายการอินพุตซ้ำ ๆ

นี่คือหนึ่งไบต์ที่สั้นกว่าการใช้แบบเรียกซ้ำโดยตรง

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

อีกกลยุทธ์สำหรับ 41 ไบต์:

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

ดังนั้นนี่คือen.wikipedia.org/wiki/Insertion_sortโดยมี%วงแทรกด้านในและfoldrใช้เป็นวงรอบนอก
Peter Cordes

8

JavaScript (ES6), 51 ไบต์

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

แต่ละลูปจะค้นหาจำนวนที่น้อยที่สุดซึ่งยังไม่ได้พบ


เรียกสิ่งนี้เกี่ยวกับ[1,2,3,4,5,4,3,2,1]ผลิตผล[1, 2, 3, 4, 5, Infinity, Infinity, Infinity, Infinity]
Benjamin Gruenbaum

@BenjaminGruenbaum "การป้อนข้อมูลจะไม่ประกอบด้วยรายการซ้ำ"
Neil

ฉันมีจำนวนไบต์เดียวกันแน่นอนด้วยวิธีการที่แตกต่างกัน
Bálint

ที่จริงแล้ว 1 ไบต์น้อยลง
Bálint

อัลกอริทึมนี้เป็นen.wikipedia.org/wiki/Selection_sort
Peter Cordes

8

Python 2, 34 ไบต์

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

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

การยกเลิกแบบคลีนสามารถทำได้ใน 41 ไบต์:

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

หรือ

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

อินพุตสามารถใช้เป็นรายการสำหรับ 39 ไบต์หรือ 38 ไบต์ใน 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})

นี่คือen.wikipedia.org/wiki/Selection_sortโดยใช้m=min(s)/ s - (m)เป็นวงในเพื่อค้นหาและลบ min จากองค์ประกอบที่ไม่เรียงลำดับและเรียกซ้ำเป็นด้านนอก
Peter Cordes

8

Haskell, 42 41 38 ไบต์

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

วนรอบจำนวนเต็มทั้งหมด (ลงนาม 64 บิตบนเครื่องของฉัน) และเก็บค่าที่อยู่ในuนั้น แน่นอนว่ามันไม่เสร็จในเวลาที่เหมาะสม

เวอร์ชันก่อนหน้าวนลูปผ่าน[minimum u..maximum u]ซึ่งมีเวลารันเคสที่แย่ที่สุดเหมือนกัน

แก้ไข: @xnor บันทึกไบต์ ขอบคุณ!


filterสั้นกว่าหนึ่ง:f u=filter(`elem`u)[minimum u..maximum u]
xnor

กำลังดุร้าย! ใช้งานไม่[minimum u..]ได้สำหรับเหตุผลประเภท?
xnor

@ xnor: ฉันคิดอย่างนั้น เมื่อโทรสมมติว่าf [1,3,0]องค์ประกอบเริ่มต้นที่จะพิมพ์Integerซึ่งไม่ได้ผูกไว้ดังนั้น..ไม่สิ้นสุด หากคุณต้องเรียกมันว่าอย่างf ([1, 3, 0]::[Int])นั้นฉันเดาว่าคำอธิบายประกอบประเภทจะต้องรวมอยู่ในจำนวนไบต์
nimi

มันตรวจจับองค์ประกอบที่เกิดขึ้นมากกว่าหนึ่งครั้งได้อย่างไร
feersum

1
@feersum: มันไม่ได้ แต่ความท้าทายบอกว่า: "การป้อนข้อมูลจะไม่ประกอบด้วยรายการซ้ำ"
nimi

8

Oracle SQL 11.2, 205 ไบต์

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

ยกเลิกแข็งแรงเล่นกอล์ฟ

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)          

สำหรับวิธีการเรียงลำดับมันคืออะไรฉันไม่มีความคิดORDER BYทำให้แน่ใจว่าฉันลืมพวกเขา


ฉันเพิ่งรู้ SQL แต่จากความคิดเห็นของคุณฉันคิดว่าคุณกำลังเลือก min หรือ max จากองค์ประกอบที่ไม่ได้เรียงลำดับที่เหลืออยู่และต่อท้ายส่วนท้ายของรายการที่เรียงลำดับ ที่ทำให้นี้en.wikipedia.org/wiki/Selection_sort
Peter Cordes

8

รหัสเครื่อง x86-16 (BubbleSort int8_t), 20 19 ไบต์

รหัสเครื่อง x86-64 / 32 (JumpDownSort) 21 19 ไบต์

การเปลี่ยนแปลง:

  • ขอบคุณ @ ped7g สำหรับแนวคิดlodsb/ cmp [si],alและวางสิ่งนั้นพร้อมกับตัวชี้เพิ่ม / รีเซ็ตที่ฉันได้ดู ไม่ต้องการal/ ahให้เราใช้รหัสเดียวกันกับเลขจำนวนเต็มที่มากกว่า

  • อัลกอริทึมใหม่ (แต่เกี่ยวข้อง) การเปลี่ยนแปลงการใช้งานหลายอย่าง: Bubbly SelectionSort ช่วยให้มีการใช้งาน x86-64 น้อยกว่าสำหรับไบต์หรือ dwords; break-even บน x86-16 (ไบต์หรือคำ) หลีกเลี่ยงข้อผิดพลาดใน size = 1 ที่ BubbleSort ของฉันมี ดูด้านล่าง

  • ปรากฎว่า Sort Bubbly Selection ของฉันพร้อม swaps ทุกครั้งที่คุณพบ min ใหม่เป็นอัลกอริทึมที่รู้จักกันแล้ว JumpDown Sort มันถูกกล่าวถึงในBubble Sort: การวิเคราะห์ขั้นตอนวิธีทางโบราณคดี (เช่น Bubble Sort กลายเป็นที่นิยมแม้จะมีการดูด)


เรียงลำดับ 8 บิตลงนามจำนวนเต็มในสถานที่ (ไม่ได้ลงชื่อคือขนาดรหัสเดียวกันเพียงแค่เปลี่ยนjgeเป็นjae) รายการซ้ำไม่ใช่ปัญหา เราสลับโดยใช้การหมุน 16 บิต 8 โดยมีปลายทางของหน่วยความจำ

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

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

รายชื่อ NASM ( nasm -l /dev/stdout) หรือแหล่งที่มาธรรมดา

 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.

พุช / ป๊อปของ cxวงรอบด้านในหมายความว่ามันทำงานโดยcx= outer_cx ลงไปที่ 0

สังเกตได้ว่า rol r/m16, imm8ไม่ใช่คำสั่ง 8086 มันถูกเพิ่มเข้ามาในภายหลัง (186 หรือ 286) แต่นี่ไม่ได้พยายามเป็นรหัส 8086 เพียงแค่ 16 บิต x86 ถ้า SSE4.1 phminposuwช่วยได้ฉันจะใช้มัน

เวอร์ชัน 32 บิตนี้ (ยังคงทำงานกับจำนวนเต็ม 8 บิต แต่ด้วยตัวชี้ / ตัวนับ 32 บิต) คือ 20 ไบต์ (คำนำหน้าของขนาดตัวถูกดำเนินการrol word [esi-1], 8)

ข้อผิดพลาด: ขนาด = 1 ถือว่าเป็นขนาด = 65536 เพราะไม่มีอะไรหยุดเราจากการเข้าสู่ด้านนอกทำ / ในขณะที่มี cx = 0 (โดยปกติคุณจะใช้jcxzสำหรับสิ่งนั้น) แต่โชคดีที่การเรียงลำดับ JumpDown ขนาด 19 ไบต์คือ 19 ไบต์และไม่มีปัญหานั้น


x86-16 ต้นฉบับรุ่น 20 ไบต์ (ไม่มีแนวคิดของ Ped7g) เว้นไว้เพื่อประหยัดพื้นที่ดูประวัติการแก้ไขพร้อมคำอธิบาย


ประสิทธิภาพ

การจัดเก็บ / โหลดซ้ำซ้อนบางส่วน (ในการหมุนของหน่วยความจำปลายทาง) ทำให้แผงลอยการส่งต่อร้านค้าบนซีพียู x86 รุ่นใหม่ (ยกเว้นอะตอมตามลำดับ) เมื่อค่าสูงกำลังเดือดปุด ๆ ขึ้นไปความล่าช้าพิเศษนี้เป็นส่วนหนึ่งของห่วงโซ่พึ่งพาห่วง เก็บ / โหลดซ้ำในสถานที่แรก (เช่น 5 รอบแฝงการส่งต่อร้านค้าบน Haswell) แต่แผงส่งต่อนำมันขึ้นไปเช่นมากขึ้น 13 รอบ การดำเนินการที่ไม่เป็นไปตามสั่งจะมีปัญหาในการซ่อนสิ่งนี้

ดูเพิ่มเติมที่: Stack Overflow: การเรียงลำดับฟองสำหรับการเรียงลำดับสตริงสำหรับเวอร์ชันของสิ่งนี้ด้วยการใช้งานที่คล้ายกัน แต่มีการเริ่มต้นเมื่อไม่จำเป็นต้องสลับ มันใช้xchg al, ah/ mov [si], axสำหรับการแลกเปลี่ยนซึ่งมีความยาว 1 ไบต์และทำให้แผงลงทะเบียนบางส่วนบน CPU (แต่อาจยังดีกว่า memory-dst หมุนซึ่งต้องโหลดค่าอีกครั้ง) ความคิดเห็นของฉันมีคำแนะนำ ...


x86-64 / x86-32 JumpDown Sort, 19 ไบต์ (เรียงลำดับ int32_t)

เรียกได้จาก C โดยใช้ x86-64 System V แบบแผนการโทรเป็น
int bubblyselectionsort_int32(int dummy, int *array, int dummy, unsigned long size); (return value = max (array []))

นี่คือhttps://en.wikipedia.org/wiki/Selection_sortแต่แทนที่จะจดจำตำแหน่งขององค์ประกอบนาทีที่สลับผู้สมัครในปัจจุบันลงในอาร์เรย์ เมื่อคุณพบค่าต่ำสุด (unsorted_region) แล้วให้เก็บไว้ที่ส่วนท้ายของพื้นที่ที่เรียงลำดับเช่นเรียงลำดับการเลือกปกติ สิ่งนี้จะขยายขอบเขตที่เรียงลำดับโดยหนึ่ง (ในรหัสให้rsiชี้ไปที่จุดสิ้นสุดจุดหนึ่งของส่วนที่เรียงแล้วเลื่อนไปข้างlodsdหน้าแล้วmov [rsi-4], eaxเก็บค่า min กลับเข้าไป)

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

การออกแบบการแลกเปลี่ยนนี้นำไปสู่ส่วนที่ไม่เรียงลำดับของอาร์เรย์ที่เรียงลำดับแบบย้อนกลับซึ่งส่วนใหญ่นำไปสู่การแลกเปลี่ยนจำนวนมากในภายหลัง (เพราะคุณเริ่มจากผู้สมัครที่มีขนาดใหญ่และเห็นผู้สมัครที่ต่ำกว่าและต่ำกว่าอยู่เรื่อย ๆ ) คุณจึงสลับสับเปลี่ยนกันไปเรื่อย ๆ ) ฉันเรียกมันว่า "bubbly" แม้ว่ามันจะย้ายองค์ประกอบไปในทิศทางอื่น วิธีที่มันเคลื่อนย้ายองค์ประกอบต่าง ๆ ก็เหมือนกับการเรียงลำดับการแทรกถอยหลัง หากต้องการดูมันในทางปฏิบัติให้ใช้ GDB display (int[12])bufตั้งค่าเบรกพอยต์บนloopคำสั่งภายในและใช้c(ดำเนินการต่อ) กด Return เพื่อทำซ้ำ (คำสั่ง "display" ทำให้ GDB พิมพ์สถานะอาร์เรย์ทั้งหมดทุกครั้งที่เรากดเบรกพอยต์)

xchgด้วย mem มีlockคำนำหน้าโดยนัยซึ่งทำให้ช้าลงเป็นพิเศษ อาจเป็นไปได้เกี่ยวกับลำดับของขนาดที่ช้ากว่าการแลกเปลี่ยนโหลด / ร้านค้าที่มีประสิทธิภาพ xchg m,rคือหนึ่งต่อ 23c ทรูพุตบน Skylake แต่โหลด / store / mov ด้วย tmp reg สำหรับการแลกเปลี่ยนที่มีประสิทธิภาพ (reg, mem) สามารถเลื่อนองค์ประกอบหนึ่งต่อนาฬิกา มันอาจจะเป็นอัตราส่วนที่แย่กว่าใน CPU ของ AMD ที่loopคำสั่งนั้นเร็วและจะไม่ทำให้เกิดปัญหาคอขวดภายในมากนัก แต่การขาดสาขาจะยังคงเป็นปัญหาคอขวดขนาดใหญ่เพราะการแลกเปลี่ยนนั้นเป็นเรื่องธรรมดา )

 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

รหัสขนาดเดียวกันสำหรับint8_tใช้งาน: ใช้lodsb/ scasb, ALและเปลี่ยนไป[rsi/rdi-4] -1รหัสเครื่องเดียวกันทำงานในโหมด 32 บิตสำหรับองค์ประกอบ 8/32 บิต โหมด 16 บิตสำหรับองค์ประกอบ 8/16 บิตจะต้องสร้างขึ้นใหม่โดยมีการเปลี่ยนแปลงออฟเซ็ต (และโหมดการกำหนดแอดเดรส 16 บิตใช้การเข้ารหัสที่แตกต่างกัน) แต่ยังคง 19 ไบต์สำหรับทุกคน

มันหลีกเลี่ยงการเริ่มต้นdec ecxด้วยการเปรียบเทียบกับองค์ประกอบที่เพิ่งโหลดก่อนที่จะย้าย ในการวนซ้ำครั้งสุดท้ายของลูปด้านนอกมันจะโหลดอิลิเมนต์สุดท้ายตรวจสอบว่ามันน้อยกว่าตัวมันเองหรือไม่ สิ่งนี้ช่วยให้มันทำงานกับขนาด = 1 ที่ BubbleSort ของฉันล้มเหลว (ถือว่าเป็นขนาด = 65536)

ฉันทดสอบรุ่นนี้ (ใน GDB) โดยใช้ผู้โทรนี้: ลองออนไลน์! . คุณสามารถเรียกใช้งานได้จาก TIO แต่แน่นอนว่าไม่มีการดีบั๊กหรือการพิมพ์ ยังคงสิ่ง_startที่เรียกว่ามันออกด้วย exit-status = องค์ประกอบที่ใหญ่ที่สุด = 99 เพื่อให้คุณสามารถดูการทำงาน


อาจมีพื้นที่สำหรับปรับปรุงในเงื่อนไขลูปภายในดูเหมือนว่าจะใช้จำนวนมากไบต์ อาจจะเป็นแบบผลัก / ป๊อปcxและใช้loopสำหรับทั้งคู่? อาจวนไปทางอื่นจากหลังไปหน้าอาร์เรย์เราจึงนับดัชนีลงไปที่ศูนย์? (และเพิ่มขึ้นbxเนื่องจากส่วนที่จัดเรียงอยู่ที่ท้ายคุณวนไปทาง)
Peter Cordes

1
รับลงไปที่ 19B แต่มีการเปลี่ยนแปลงมากมายและยังป้อนข้อมูล regs (การเปลี่ยนแปลงบางอย่างอาจไม่จำเป็น แต่เมื่อฉันเล่นรอบ ๆ พวกเขายังคงอยู่ที่นั่นจากการทดลองก่อนหน้านี้) ... มันยังคงขึ้นอยู่กับงานของคุณ มันเป็นคำตอบคุณสามารถตรวจสอบได้ที่ pastebin: pastebin.com/0VMzdUjj
Ped7g

@ Ped7g: ดีมาก! ผมถือว่าsub si, cxเป็นส่วนหนึ่งของห่วงด้านนอกใช้ตัวชี้แทนการจัดทำดัชนี แต่ฉันไม่เคยคิด/lodsb cmp [si], alฉันกำลังพิจารณาlodsw/ dec siหรือlodsb/ xchg al,ahเพื่อตั้งค่าสำหรับcmp ah,al
Peter Cordes

@ Ped7g: โอ้รุ่นของคุณต้องการcldหรือฉันเดาว่าเราสามารถทำให้เป็นส่วนหนึ่งของการประชุมที่เรียก AFAIK การDFล้างข้อมูลไม่ใช่ส่วนมาตรฐานของการประชุมแบบ 16 บิตเพียง 32/64 หรือว่าคุณไม่สามารถสันนิษฐานได้ใน bootloader? แต่ด้วยหลักการเรียกการลงทะเบียนแบบกำหนดเองนี่เป็นส่วนของโค้ดมากพอ ๆ กับฟังก์ชั่นดังนั้นทำไมไม่ต้องใช้ DF = 0 (และถ้าเราต้องการ ES = DS เพื่อให้เราสามารถทำได้scasbแทนที่จะlodsbสะดวกกว่า)
Peter Cordes

1
@ Ped7g: ฉันไม่รู้เกี่ยวกับอนุสัญญา 16 บิตทั้งหมดที่ฉันรู้ก็คือคุณไม่คิดว่า DF จะถูกลบไปตลอดเวลา แต่ฉันคิดว่าส่วนใหญ่อยู่ในบริบทของ bootloader ฉันไม่เคยทำงานอะไรที่ฉันเขียนบน DOS จริง ฉันอยู่ที่ Atari Mega 4 STe (68000/68020) จากนั้น Linux (ใน Pentium MMX) ดังนั้นฉันจึงพยายามหลีกเลี่ยง x86 16- บิตโดยสิ้นเชิงจนกระทั่งคำถามนั้นกระแทกลงที่คอของฉัน
Peter Cordes

6

C, 72 ไบต์

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

การเรียงลำดับแบบฟอง อาร์กิวเมนต์แรกคือตัวชี้ไปยังอาร์เรย์อาร์กิวเมนต์ที่สองคือความยาวของอาร์เรย์ ทำงานร่วมกับ gcc


นี่ต้องเป็นเวอร์ชันที่อ่านง่าย มันยากมากที่จะติดตามว่าผู้ประกอบการที่ประกอบไปด้วยจุดเริ่มต้น / สิ้นสุด
Peter Cordes

5

MATL , 11 10 ไบต์

Y@t!d0>AY)

การตรวจสอบที่ไม่มีประสิทธิภาพอย่างมากของการเรียงสับเปลี่ยนทั้งหมดของอินพุต

ลองออนไลน์!

คำอธิบาย

        % 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

Ruby, 40 ไบต์

เรียงลำดับการคัดเลือก ฟังก์ชั่นไม่ระบุชื่อ; ใช้รายการเป็นอาร์กิวเมนต์

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

4

Python ขนาด 120 ไบต์

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]

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


โพสต์แรกที่ดี! และชื่อผู้ใช้ที่ดี : P
Rɪᴋᴇʀ

4

MIPS, 68 ไบต์

ฉันเขียนการใช้การเรียงลำดับฟองที่ไม่ได้เพิ่มประสิทธิภาพอย่างง่าย ๆ เมื่อไม่นานมานี้ จำนวนไบต์เริ่มต้นที่loopและสิ้นสุดที่li $v0, 10สมมติว่าที่อยู่ในรายการและความยาวของรายการอยู่ในหน่วยความจำแล้ว

 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

ตอนนี้ฉันรอที่จะปลิวไปกับน้ำด้วย x86 ...


1
คุณสามารถออกจากการswapped=trueตรวจสอบก่อนกำหนดและนับถอยหลังตามขนาดอาร์เรย์ ดูรุ่น x86-16 ของฉัน 20 ไบต์ที่เรียงลำดับจำนวนเต็ม ฉันอาจสร้าง x86 รุ่นธรรมดา 32 หรือ 64 บิตที่เรียงลำดับจำนวนเต็ม 32 บิตในบางจุด แต่จำนวนเต็ม 8 บิตในโหมด 16 บิตเป็นจุดที่น่าสนใจสำหรับ x86
Peter Cordes

4

Awk, 66 ไบต์

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

อาร์เรย์ใน awk เป็นเหมือนพจนานุกรมไม่ใช่เช่นอาร์เรย์ C ดัชนีสามารถไม่ต่อเนื่องกันและดัชนีเหล่านี้จะเติบโต (และถูกสร้าง) ตามต้องการ ดังนั้นเราจึงสร้างอาร์เรย์aสำหรับอินพุตโดยแต่ละบรรทัดจะเป็นคีย์ และเราบันทึกค่าต่ำสุดและสูงสุด aจากนั้นเราก็ห่วงจากนาทีสูงสุดและพิมพ์คีย์ทั้งหมดที่มีอยู่ใน เป็นเพียงการที่จะหลีกเลี่ยงการใช้ซ้ำb$0


4

Python 3, 91 62 47 ไบต์

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

ขอบคุณwnnmawและSeeqสำหรับความช่วยเหลือในการเล่นกอล์ฟ

อาร์กิวเมนต์zควรเป็นรายการ นี่คือตัวแปรของการเรียงลำดับการเลือก

ฉันไม่แน่ใจว่าminกองซ้อนกันbuilt-in sorting functionsอย่างไรเนื่องจากฉันไม่แน่ใจว่า Python ใช้งานminอย่างไร หวังว่าวิธีนี้จะยังคงใช้ได้ คำแนะนำการเล่นกอล์ฟใด ๆ ในความคิดเห็นหรือในการแชท PPCGยินดีต้อนรับ


ตรวจสอบให้แน่ใจว่าได้ระบุประเภทการเรียงที่คุณใช้
Michelfrancis Bustillos

@MichelfrancisBustillos ฉันลืมโดยสุจริตว่าอัลกอริทึมนี้คืออะไร อาจจะเรียงลำดับการเลือก?
Sherlock9

1
เพิ่งอยากรู้อยากเห็นทำไมไม่เพียงแค่นำรายการโดยตรง คำถามอนุญาตให้ใช้รูปแบบอินพุตแบบเปิด
wnnmaw

1
@wnnmaw แดงฉันเขียนขึ้นมา แต่ลืมโพสต์ไป ขอบคุณสำหรับการเตือน: D
Sherlock9

อืมบางทีdef f(z):\nwhile z:m=min(z);z.remove(m);yield m
seequ

4

MATL 11 ไบต์

`t4#X<2#)tn

ลองออนไลน์!

เรียงลำดับตามขั้นตอนต่อไปนี้ซึ่งก็คือO ( n 2 ):

  1. ใช้ขั้นต่ำของอาร์เรย์
  2. ลบค่านั้นออกจากอาร์เรย์และเก็บไว้เพื่อการแสดงผลในภายหลัง
  3. ใช้โพรซีเดอร์เดียวกันกับส่วนที่เหลือของอาร์เรย์จนกว่าจะว่างเปล่า
  4. แสดงตัวเลขทั้งหมดตามลำดับที่ได้รับ

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

`        % 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 ไบต์

บันทึกสองไบต์ด้วย @Jakube

Bogosort

f!s>VTtT.p

ลองมันออนไลน์ได้ที่นี่

ฉันไม่ต้องการhcuz ที่เรารับประกันว่าจะไม่ซ้ำกัน


@ Jakube ฉันรู้สึกโง่ขอบคุณ
Maltysen

@ ในขณะที่ฉันพูดในคำตอบของฉันเรารับประกันว่าจะไม่ซ้ำกันตาม OP
Maltysen

ขอโทษสำหรับเรื่องนั้น! พลาดจุดนั้น
Suever

3

อย่างจริงจัง 6 ไบต์

,;l@╨m

ลองออนไลน์!

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

คำอธิบาย:

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

อย่างจริงจัง 25 ไบต์ (ไม่ใช่การแข่งขัน)

นี่จะเป็นการแข่งขันหากไม่มีข้อผิดพลาดในคำสั่ง shuffle ที่ฉันเพิ่งแก้ไข

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

ลองออนไลน์! นี่เป็นขั้นตอนวิธีการเรียงลำดับที่ดีที่สุดที่เคยมีมา: Bogosort !

คำอธิบาย:

,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 ไบต์

บันทึกหนึ่งไบต์เพื่อสร้างอาร์เรย์ว่างด้วย @LuisMendo

vTbtX<-QI$(f8M+q

ถังเรียง อย่าลองด้วยช่วงที่มากกว่า 2 31 -1

ลองออนไลน์!

คำอธิบาย

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:

  • คุณสามารถเริ่มต้นอาร์เรย์ว่างเปล่าใน MATL โดยใช้[]และเติบโตได้เช่นเดียวกับใน MATLAB
  • วิธีใช้(สำหรับการจัดทำดัชนีการมอบหมาย
  • วิธีใช้Mคลิปบอร์ดอัตโนมัติ

ใหม่วันใหม่ TIL:

  • vertcat สร้างอาร์เรย์ว่างอย่างน่าอัศจรรย์เมื่อไม่มีสิ่งใดในกองซ้อนที่จะต่อกัน

เพิ่มใน TIL ของคุณ: เริ่มต้น จะถูกแทนที่ด้วย[] vนี่เป็นเพราะจำนวนอินพุตเริ่มต้นของvคือจำนวนองค์ประกอบในสแต็ก
Luis Mendo

@LuisMendo Sooo ... ถ้ามีหนึ่งแถวใน stack ... ? งานค้นคว้า
บีกเกอร์

จากนั้นก็ไม่ทำอะไรเลย คิดว่ามันเป็นvertcat(STACK{:})
Luis Mendo

3

จูเลีย28 28ไบต์

x->colon(extrema(x)...)∩x

ลองออนไลน์!


สิ่งนี้สร้างช่วงตั้งแต่นาทีถึงสูงสุดและตัดกับรายการเดิมหรือไม่ ที่จะเป็นรสชาติของen.wikipedia.org/wiki/Counting_sortเช่นคู่คำตอบอื่น ๆ : codegolf.stackexchange.com/a/117648/30206 (คำถามที่ไม่จำเป็นต้องใช้เฉพาะคำตอบที่จะบอกว่าสิ่งที่ชนิดของการจัดเรียงมันเป็น.)
ปีเตอร์ Cordes

3

R, 68 ไบต์

รับอินพุตiและเอาต์พุตoซึ่งเป็นรายการที่เรียงลำดับ

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

คำอธิบาย:

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

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


3

Java 8, 112 92 ไบต์

นี่คือตัวเลือกอื่น อินพุตเป็นList tจำนวนเต็มและเอาต์พุตที่เรียงลำดับแล้วจะพิมพ์ออกมาเป็นมาตรฐาน

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

ปรับปรุง

  • -20 [16-08-21] ใช้แลมบ์ดา

สวัสดีไม่เชิงเส้นและยินดีต้อนรับสู่ PPCG!
isaacg

ยินดีต้อนรับสู่ Programming Puzzles & Code Golf! ดูเหมือนว่ารหัสของคุณจะถือว่าตัวแปรtมีอยู่ซึ่งทำให้เป็นข้อมูลโค้ด เราต้องการที่จะส่งโปรแกรมเต็มหรือฟังก์ชั่นที่ใช้ของเราเริ่มต้น I / O รูปแบบ นอกจากนี้เรายังต้องการการนำเข้าเพื่อคำนึงถึงจำนวนไบต์ แจ้งให้เราทราบหากคุณมีข้อสงสัย!
Alex A.

ขอบคุณสำหรับทรัพยากร! ฉันแก้ไขคำตอบของฉันให้เป็นฟังก์ชันและรวมการนำเข้า
NonlinearFruit

2

เรติน่า, 95

แก้ไขการเรียงลำดับฟอง ฉันสงสัยว่ามีวิธีที่ดีกว่าในการทำเช่นนี้แม้ว่าจะไม่มีจอประสาทตาในตัว

-\d+
$*n
\d+
$*11
+`(1+) (n+)
$2 $1
+`\b(n+) (\1n+)|(1+)(1+) \3\b
$2$3 $1$3$4
1(1*)
$.1
n+
-$.&
  • ขั้นตอนที่ 1 - แปลงจำนวนเต็ม -ve เป็นเอกภาพด้วยnเป็นหลัก; วาง-สัญญาณ
  • ขั้นตอนที่ 2 - แปลง + ve และเลขจำนวนเต็มเป็นศูนย์ด้วยกัน 1กลายเป็นตัวเลขด้วยหลัก เพิ่ม11ไปยังแต่ละคนเพื่อให้เป็นศูนย์เป็นตัวแทนจาก
  • ด่าน 3 - ย้ายทุกด้านไปด้านหน้า
  • ขั้นที่ 4 - การเรียงลำดับ: เลื่อนทุกด้านด้วยขนาดที่ใหญ่ที่สุด ย้าย + ves ที่เล็กกว่าไปข้างหน้า + ves ที่ใหญ่กว่า
  • ขั้นตอนที่ 5 - ลบ 1 จากและแปลง + กลับไปเป็นทศนิยม
  • ขั้นตอนที่ 6 - แปลง -ve ตัวอักษรกลับเป็นทศนิยมรวมถึงเครื่องหมาย

ลองออนไลน์



@LeakyNun นั่นไม่ได้เรียงลำดับองค์ประกอบสุดท้ายในรายการ
mbomb007

@ mbomb007 ถูกต้องไม่เป็นไร
Leun Nun

2

ทับทิมขนาด 22 ไบต์

รวดเร็วเรียงลำดับการเปลี่ยนแปลง ทำงานในพื้นที่และเวลา O (n!)

->a{a.permutation.min}

2

Clojure, 73 35 ไบต์

Bogosort :)

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

รุ่นก่อนหน้า:

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

ลดลงในรายการที่เรียงลำดับrโดยแยกออกเป็นส่วน "เล็กกว่าฉัน" และ "ใหญ่กว่าฉัน" ผมคิดว่านี่คือการจัดเรียงแทรก


ดี! ฉันไม่ทราบว่าคุณสามารถrecurใช้ฟังก์ชันที่ไม่ระบุชื่อได้หรือไม่ shuffleนอกจากนี้ยังไม่ทราบเกี่ยวกับ
Matias Bjarland

2

Ruby, 26 24 ไบต์

การเรียงลำดับการเลือกคล้ายกับคำตอบของ Value Ink แต่ใช้วิธีการที่แตกต่างกันเพื่อเพิ่มความเป็นกอล์ฟ

ตามข้อกำหนด: "อินพุต / เอาท์พุตสามารถทำได้ทุกวิธีที่คุณเลือกตราบใดที่มนุษย์อ่านได้" ฉันคิดว่านี่เหมาะกับคำอธิบายเอาต์พุตเป็นอาร์เรย์ของอาร์เรย์ที่มีองค์ประกอบเดียว

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

ตัวอย่าง:

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

2

Java 7, 106 104 ไบต์

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

นี่คือการเรียงลำดับฟอง ole ที่ดี พารามิเตอร์ฟังก์ชั่นได้รับการแก้ไขเพื่อให้ฉันไม่ต้องส่งคืน ยังคงพยายามบีบบางส่วนออกจากนี้เพื่อให้ฉันสามารถเอาชนะแลมบ์ดา java ที่มีคนโพสต์

-1 ไบต์ขอบคุณGeobitsสำหรับการชี้ให้เห็นว่าการเปลี่ยนจังหวะปกติ xor'ing
-1 ไบต์ขอบคุณLeaky Nunสำหรับการชี้ให้เห็นว่าฉันสามารถย้ายการประกาศ int ทั้งหมดลงใน for-loop

ลองออนไลน์!


2

ทับทิมขนาด 22 ไบต์

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

สร้างอาร์เรย์ออกจากช่วงระหว่างองค์ประกอบขั้นต่ำและสูงสุดของอาร์เรย์อินพุต ส่งคืนจุดตัดระหว่างสองอาร์เรย์


ฉันเดาว่าเป็นชนิดของen.wikipedia.org/wiki/Counting_sort
Peter Cordes

@PeterCordes นั่นเป็นจุดที่
dkudriavtsev

คำถามขอให้คุณอธิบายประเภทของการเรียงลำดับดังนั้นฉันคิดว่ามันมีประโยชน์ที่จะเชื่อมโยงไปยังอัลกอริทึมที่รู้จักกันดีรวมทั้งอธิบายสิ่งที่มันทำ
Peter Cordes

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