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


110

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

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


8
วิกิพีเดียสำหรับการเลือกการจัดเรียงมาพร้อมกับรหัสเทียมและภาพประกอบสวยเช่นเดียวกับหนึ่งสำหรับการจัดเรียงแทรก
G.Bach

6
@ G.Bach - ขอบคุณสำหรับสิ่งนี้ ... ฉันอ่านทั้งสองหน้าหลายครั้ง แต่ไม่เข้าใจความแตกต่าง - ด้วยเหตุนี้คำถามนี้
eb80

3
ตาม Computerphile พวกเขาเหมือนกัน: youtube.com/watch?v=pcJHkWwjNl4
Tristan Forward

คำตอบ:


186

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

รับรายการนำองค์ประกอบปัจจุบันและแลกเปลี่ยนกับองค์ประกอบที่เล็กที่สุดทางด้านขวามือขององค์ประกอบปัจจุบัน เรียงลำดับการเลือก

เรียงลำดับการแทรก:

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

เวลาความซับซ้อนของการเลือกการจัดเรียงอยู่เสมอในขณะที่การจัดเรียงแทรกมีความซับซ้อนเวลาดีกว่าที่เป็นความซับซ้อนกรณีเลวร้ายที่สุดคือn(n - 1)/2 โดยทั่วไปจะใช้เวลาในการเปรียบเทียบน้อยกว่าหรือเท่ากับแล้วn(n - 1)/2n(n - 1)/2

ที่มา: http://cheetahonfire.blogspot.com/2009/05/selection-sort-vs-insertion-sort.html


3
@Nikolay - อันนี้คัดลอกมาจากcheetahonfire.blogspot.com/2009/05/…ซึ่งอ่านแล้ว มีอะไรเพิ่มเติมร่วมกันเมื่อฉันได้อ่านบทความที่ขัดแย้งกัน
eb80

5
ความแตกต่างหลักคือขั้นตอนการเลือก การเรียงลำดับการเลือกจะเลือกรายการที่เล็กที่สุดและสลับกับลำดับแรกการเรียงลำดับการแทรกจะแทรกรายการปัจจุบันในตำแหน่งที่เหมาะสม
Nikolay Kostov

6
@ eb80 ฉันไม่แน่ใจว่าคุณกำลังอ่านเนื้อหาอะไร แต่ฉันไม่เห็นว่าตัวอย่างจะเป็นรูปธรรมมากไปกว่านี้ได้อย่างไร?
G.Bach

24
แต่จำนวนสว็อปล่ะ? การเลือกจะทำการเปรียบเทียบ n (n-1) / 2 เสมอ แต่ในกรณีที่เลวร้ายที่สุดมันจะทำการแลกเปลี่ยน n-1 เท่านั้น ในกรณีที่เลวร้ายที่สุดการแทรกจะทำการเปรียบเทียบ n (n-1) / 2 เช่นเดียวกับการแลกเปลี่ยน n (n-1) / 2
Jason Goemaat

2
@ ประดับทั้งสองสิ่งเหล่านี้ไม่ใช่การแบ่งและพิชิตอัลกอริทึม
Asky McAskface

66

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

ความแตกต่างอยู่ในสิ่งที่วงในทำ:

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

  • ในการเรียงลำดับการแทรกแต่ละรอบของวงในจะวนซ้ำเหนือองค์ประกอบที่เรียงลำดับ องค์ประกอบที่เรียงลำดับจะถูกแทนที่จนกว่าลูปจะพบตำแหน่งที่ถูกต้องเพื่อแทรกองค์ประกอบที่ไม่ได้เรียงลำดับถัดไป

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

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


24

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

ป้อนคำอธิบายภาพที่นี่



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

ป้อนคำอธิบายภาพที่นี่


เพียงตรวจสอบmycodeschoolบน Youtube อย่างไรก็ตามคำตอบนี้สอดคล้องกับสิ่งที่อธิบายในวิดีโอของ 2 อัลกอริทึมบน youtube
JaydeepW

21

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

วิธีที่ง่ายที่สุดในการทำความเข้าใจอัลกอริทึมการเรียงลำดับคือการได้รับคำอธิบายโดยละเอียดของอัลกอริทึม (ไม่ใช่สิ่งที่คลุมเครือเช่น "การเรียงลำดับนี้ใช้ swap ที่ไหนสักแห่งฉันไม่ได้บอกว่าที่ไหน") รับไพ่มา (5-10 ใบก็น่าจะเพียงพอแล้ว สำหรับอัลกอริทึมการเรียงลำดับอย่างง่าย) และเรียกใช้อัลกอริทึมด้วยมือ

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

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

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


1
สิ่งนี้มีประโยชน์มาก ... ย่อหน้าสุดท้ายทำให้ฉันสับสนซึ่งเกิดจากตัวแปรในแต่ละประเภท
eb80

1
+1 สำหรับการสังเกตว่าการใช้การเรียงลำดับการแทรกในรายการที่เชื่อมโยงนั้นมีประสิทธิภาพในการแลกเปลี่ยนที่แตกต่างอย่างสิ้นเชิงกับอาร์เรย์แบบแทนที่
Gavin Achtemeier

12

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

  • การเรียงลำดับการแทรก : แทรกองค์ประกอบถัดไปในตำแหน่งที่ถูกต้อง

  • การเรียงลำดับการเลือก : เลือกองค์ประกอบที่เล็กที่สุดและแลกเปลี่ยนกับรายการปัจจุบัน

นอกจากนี้ยังมีการจัดเรียงแทรกมีเสถียรภาพเมื่อเทียบกับการเลือกเรียง

ฉันใช้ทั้งสองอย่างใน python และมันก็น่าสังเกตว่ามันคล้ายกันแค่ไหน:

def insertion(data):
    data_size = len(data)
    current = 1
    while current < data_size:
        for i in range(current):
            if data[current] < data[i]:
                temp = data[i]
                data[i] = data[current]
                data[current] = temp

        current += 1

    return data

ด้วยการเปลี่ยนแปลงเล็กน้อยคุณสามารถสร้างอัลกอริทึมการเรียงลำดับการเลือกได้

def selection(data):
    data_size = len(data)
    current = 0
    while current < data_size:
        for i in range(current, data_size):
            if data[i] < data[current]:
                temp = data[i]
                data[i] = data[current]
                data[current] = temp

        current += 1

    return data

ขออภัยฉันสงสัยว่าทำไม (อัลกอริทึมการเรียงลำดับการเลือก) ข้อมูล [i] จึงถูกแลกเปลี่ยนด้วยข้อมูล [ปัจจุบัน] เมื่อใดก็ตามที่ข้อมูล [i] มีขนาดเล็กลง ในการเรียงลำดับการเลือกพื้นฐาน / ดั้งเดิม (?) เราจะพบค่าต่ำสุดระหว่างช่วง (i, data_size) และแลกเปลี่ยนข้อมูล [i] ด้วยค่าต่ำสุดนั้น ... ซึ่งแตกต่างกันเล็กน้อย ...
Tony Ma

5

ในระยะสั้น

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

การเรียงลำดับการแทรก:ตรงข้ามกับการเรียงลำดับการเลือกซึ่งจะเลือกองค์ประกอบแรกจากอาร์เรย์ย่อยที่ไม่ได้เรียงลำดับและเปรียบเทียบกับอาร์เรย์ย่อยที่เรียงลำดับแล้วแทรกองค์ประกอบที่เล็กที่สุดที่พบและเปลี่ยนองค์ประกอบที่เรียงลำดับทั้งหมดจากด้านขวาไปยังองค์ประกอบที่ไม่ได้เรียงลำดับแรก


4

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


4

โดยทั่วไปอัลกอริทึมทั้งสองจะทำงานเช่นนี้

ขั้นตอนที่ 1: นำองค์ประกอบที่ไม่ได้เรียงลำดับถัดไปจากรายการที่ไม่ได้เรียงลำดับแล้ว

ขั้นตอนที่ 2: วางไว้ในตำแหน่งที่ถูกต้องในรายการที่จัดเรียง

หนึ่งในขั้นตอนนั้นง่ายกว่าสำหรับอัลกอริทึมเดียวและในทางกลับกัน

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

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


3

ฉันจะลองอีกครั้ง: พิจารณาสิ่งที่เกิดขึ้นในกรณีที่โชคดีของอาร์เรย์ที่จัดเรียงเกือบ

ในขณะที่จัดเรียงอาร์เรย์สามารถคิดได้ว่ามีสองส่วนคือด้านซ้ายมือ - จัดเรียงด้านขวามือ - ไม่เรียงลำดับ

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

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

. Btw นี้เป็นสิ่งที่heapsortปรับปรุงเมื่อเรียงลำดับตัวเลือก - มันสามารถที่จะหาองค์ประกอบที่เล็กมากขึ้นอย่างรวดเร็วเนื่องจากการกอง


3

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

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


3

ตัวเลือกของอัลกอริธึมการเรียงลำดับทั้ง 2 นี้มาจากโครงสร้างข้อมูลที่ใช้

เมื่อคุณใช้อาร์เรย์ให้ใช้การเรียงลำดับการเลือก (แม้ว่าทำไมเมื่อคุณสามารถใช้ qsort?) เมื่อคุณใช้รายการที่เชื่อมโยงให้ใช้การเรียงลำดับการแทรก

นี้เป็นเพราะ:

  • การส่งผ่านรายการที่เชื่อมโยงมีราคาแพงกว่าอาร์เรย์
  • การแทรกรายการที่เชื่อมโยงนั้นถูกกว่าอาร์เรย์มาก

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

การเรียงลำดับการเลือกจะต่อท้ายเสมอดังนั้นจึงไม่มีปัญหานี้เมื่อใช้อาร์เรย์ ดังนั้นข้อมูลจึงไม่จำเป็นต้อง "ผลักกลับ"


2

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

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

การเรียงลำดับการแทรกสามารถแสดงเป็น:

    for(i=1;i<n;i++)
        for(j=i;j>0;j--)
            if(arr[j]<arr[j-1])
                temp=arr[j];
                arr[j]=arr[j-1];
                arr[j-1]=temp;

การเรียงลำดับการเลือกสามารถแสดงเป็น:

    for(i=0;i<n;i++)
        min=i;
        for(j=i+1;j<n;j++)
        if(arr[j]<arr[min])
        min=j;
        temp=arr[i];
        arr[i]=arr[min];
        arr[min]=temp;

2

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

  1. วงในจะผ่านองค์ประกอบเพียงครึ่งเดียวในกรณีเฉลี่ย
  2. วงในจะถูกยกเลิกเร็วขึ้นถ้าอาร์เรย์เกือบจะเรียงลำดับ
  3. วงในจะยกเลิกทันทีหากเรียงลำดับอาร์เรย์แล้วทำให้ความซับซ้อนของการเรียงลำดับการแทรกเป็นเส้นตรงในกรณีนี้

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


1

แม้ว่าความซับซ้อนของเวลาของการเรียงลำดับการเลือกและการเรียงลำดับการแทรกจะเหมือนกันนั่นคือ n (n - 1) / 2 การเรียงลำดับการแทรกประสิทธิภาพโดยเฉลี่ยจะดีกว่า ทดสอบกับซีพียู i5 ของฉันด้วยจำนวนเต็ม 30000 แบบสุ่มการเรียงลำดับการเลือกใช้เวลา 1.5 วินาทีโดยเฉลี่ยในขณะที่การเรียงลำดับการแทรกใช้เวลาเฉลี่ย 0.6 วินาที


ยินดีต้อนรับสู่ StackOverflow และขอขอบคุณสำหรับคำตอบ เป็นไปได้มากที่คุณจะเห็นว่าหลายคนให้คำตอบที่ดีพร้อมภาพประกอบ ตัวอย่างเช่น Nikolay Kostov เมื่อ 7 ปีก่อนกล่าวว่าความซับซ้อนของเวลาจะเหมือนกันในกรณีที่เลวร้ายที่สุดสำหรับการเรียงลำดับการแทรกเท่านั้น หากคุณคิดว่าเขาคิดผิดเรายินดีให้คำตอบพร้อมรายละเอียดเพิ่มเติม
Maxim Sagaydachny

0

คำอธิบายง่ายๆอาจเป็นดังนี้:

ระบุ : อาร์เรย์หรือรายการตัวเลขที่ไม่ได้เรียงลำดับ

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

เรียงลำดับการแทรก:คุณจะเห็นรายการจากบนลงล่างเพื่อให้เข้าใจง่ายขึ้น เราถือว่าองค์ประกอบแรกเป็นค่าต่ำสุดเริ่มต้นของเรา ตอนนี้แนวคิดก็คือเราสำรวจผ่านแต่ละดัชนีของรายการ / อาร์เรย์นั้นเชิงเส้นเพื่อดูว่ามีองค์ประกอบอื่น ๆ ในดัชนีใดที่มีค่าน้อยกว่าค่าต่ำสุดเริ่มต้นหรือไม่ หากเราพบค่าดังกล่าวเราก็แค่สลับค่าที่ดัชนีของมันเช่นสมมติว่า 15 เป็นค่าเริ่มต้นขั้นต่ำที่ดัชนี 1 และในระหว่างการส่งผ่านเชิงเส้นของดัชนีเราจะพบตัวเลขที่มีค่าน้อยกว่าเช่น 7 ที่ดัชนี 9 ตอนนี้ค่านี้ 7 ที่ดัชนี 9 จะสลับกับดัชนี 1 ที่มี 15 เป็นค่าของมัน การส่งผ่านนี้จะดำเนินการเปรียบเทียบกับค่าของดัชนีปัจจุบันกับดัชนีที่เหลือเพื่อแลกเปลี่ยนค่าที่น้อยกว่า สิ่งนี้จะดำเนินต่อไปจนถึงดัชนีสุดท้ายที่สองของรายการ / อาร์เรย์

เรียงลำดับการเลือก:สมมติว่าองค์ประกอบดัชนีแรกของรายการ / อาร์เรย์ถูกจัดเรียง ตอนนี้จากองค์ประกอบที่ดัชนีที่สองเราเปรียบเทียบกับดัชนีก่อนหน้าเพื่อดูว่าค่าน้อยกว่าหรือไม่ การข้ามผ่านสามารถมองเห็นได้เป็นสองส่วนเรียงลำดับและไม่เรียงลำดับ เราจะเห็นภาพการตรวจสอบเปรียบเทียบจากสิ่งที่ไม่เรียงลำดับไปยังการเรียงลำดับสำหรับดัชนีที่กำหนดในรายการ / อาร์เรย์ สมมติว่าคุณมีค่า 19 ที่ดัชนี 1 และค่า 10 ที่ดัชนี 3 เราพิจารณาการส่งผ่านจากค่าที่ไม่เรียงลำดับไปยังการเรียงลำดับเช่นขวาไปซ้าย สมมติว่าเราต้องเรียงลำดับที่ดัชนี 3 เราจะเห็นว่ามันมีค่าน้อยกว่าดัชนี 1 เมื่อเทียบจากขวาไปซ้าย เมื่อระบุได้แล้วเราก็วางเลข 10 นี้ของดัชนี 3 ในตำแหน่งของดัชนี 1 ที่มีค่า 19 ค่าเดิม 19 ที่ดัชนี 1 จะเลื่อนไปทางขวาทีละที่

ฉันไม่ได้เพิ่มรหัสใด ๆ เนื่องจากคำถามดูเหมือนเกี่ยวกับการทำความเข้าใจแนวคิดของวิธีการข้ามผ่าน


0

การเรียงลำดับการแทรกไม่สลับสิ่งต่างๆ แม้ว่าจะใช้ประโยชน์จากตัวแปร temp จุดสำคัญในการใช้ temp var คือเมื่อเราพบว่าค่าที่ดัชนีมีค่าน้อยกว่าเมื่อเทียบกับค่ากับดัชนีก่อนหน้าเราจะเลื่อนค่าที่มากขึ้นไปยังตำแหน่งที่มีค่าน้อยกว่า ดัชนีที่จะเขียนสิ่งต่างๆ จากนั้นเราใช้ temp var เพื่อแทนที่ในดัชนีก่อนหน้า ตัวอย่าง: 10, 20, 30, 50, 40. การวนซ้ำ 1: 10, 20, 30, 50, 50 [temp = 40] การวนซ้ำ 2: 10,20, 30, 40 (ค่าของอุณหภูมิ), 50 ดังนั้นเรา เพียงแค่ใส่ค่าในตำแหน่งที่ต้องการจากตัวแปรบางตัว

แต่เมื่อเราพิจารณาการเรียงลำดับการเลือกอันดับแรกเราจะพบดัชนีที่มีค่าต่ำกว่าและสลับค่านั้นด้วยค่าจากดัชนีแรกและทำการสลับซ้ำ ๆ จนกว่าดัชนีทั้งหมดจะเรียงลำดับ สิ่งนี้เหมือนกับการแลกเปลี่ยนสองตัวเลขแบบดั้งเดิมทุกประการ ตัวอย่าง: 30, 20, 10, 40, 50 การวนซ้ำ 1: 10, 20, 30, 40, 50 ที่นี่ temp var ใช้สำหรับการแลกเปลี่ยนโดยเฉพาะ



0

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

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

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

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

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

สรุป:

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

การเรียงลำดับการแทรกจะเผยแพร่องค์ประกอบแรกที่พบในส่วนที่ไม่ได้เรียงลำดับไปยังที่ใดก็ได้ในส่วนที่เรียงลำดับ


-1

ในแง่คนธรรมดา (และอาจเป็นวิธีที่ง่ายที่สุดในการเข้าใจปัญหาระดับสูง)

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

อย่างไรก็ตามในการเรียงลำดับการเลือกสิ่งที่คุณกำลังทำนั้นคล้ายกับการจัดเรียงไพ่ คุณดูไพ่เอาใบที่เล็กที่สุดวางไว้ทางซ้ายสุดและอื่น ๆ


3
เขากำลังถามเกี่ยวกับความแตกต่างระหว่างการเลือกและการจัดเรียงการแทรก
XuDing

-1

การเลือก - เลือกรายการใดรายการหนึ่ง (ต่ำสุด) และสลับกับองค์ประกอบ i (ไม่มีการวนซ้ำ) (เช่นที่หนึ่งสองสาม ....... ) ดังนั้นการจัดเรียงรายการในด้านเดียว

การแทรก - การเปรียบเทียบครั้งแรกกับครั้งที่สองเปรียบเทียบที่สามกับครั้งที่สองและครั้งแรกเปรียบเทียบที่สี่กับครั้งที่สามวินาทีและครั้งแรก ......

ลิงค์ที่เปรียบเทียบการเรียงลำดับทั้งหมด

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