Sắp xếp chèn so với Sắp xếp lựa chọn


109

Tôi đang cố gắng hiểu sự khác biệt giữa Sắp xếp chèn và Sắp xếp lựa chọn.

Cả hai dường như đều có hai thành phần: danh sách chưa được sắp xếp và danh sách đã được sắp xếp. Cả hai dường như đều lấy một phần tử từ danh sách chưa được sắp xếp và đặt nó vào danh sách được sắp xếp ở vị trí thích hợp. Tôi đã thấy một số trang web / sách nói rằng sắp xếp lựa chọn thực hiện điều này bằng cách hoán đổi từng cái một trong khi sắp xếp chèn chỉ đơn giản là tìm đúng vị trí và chèn nó. Tuy nhiên, tôi đã thấy các bài báo khác nói điều gì đó, nói rằng sắp xếp chèn cũng hoán đổi. Do đó, tôi bối rối. Có nguồn kinh điển nào không?


8
Wikipedia cho phân loại lựa chọn đi kèm với mã giả và hình ảnh minh họa đẹp, cũng như cái để phân loại chèn .
G. Bach

6
@ G.Bach - cảm ơn vì điều này ... Tôi đã đọc cả hai trang nhiều lần nhưng không hiểu sự khác biệt - do đó câu hỏi này.
eb80

3
Theo Computerphile, họ giống nhau: youtube.com/watch?v=pcJHkWwjNl4
Tristan Forward

Câu trả lời:


184

Sắp xếp lựa chọn:

Cho một danh sách, lấy phần tử hiện tại và trao đổi nó với phần tử nhỏ nhất ở phía bên phải của phần tử hiện tại. Sắp xếp lựa chọn

Sắp xếp chèn:

Đưa ra một danh sách, lấy phần tử hiện tại và chèn nó vào vị trí thích hợp của danh sách, điều chỉnh danh sách mỗi khi bạn chèn. Nó tương tự như việc sắp xếp các quân bài trong trò chơi Bài chòi. Sắp xếp chèn

Độ phức tạp thời gian của sắp xếp lựa chọn luôn luôn như vậy n(n - 1)/2, trong khi sắp xếp chèn có độ phức tạp thời gian tốt hơn vì độ phức tạp trong trường hợp xấu nhất của nó là n(n - 1)/2. Nói chung sau đó sẽ có những so sánh nhỏ hơn hoặc bằng n(n - 1)/2.

Nguồn: http://cheetahonfire.blogspot.com/2009/05/selection-sort-vs-insertion-sort.html


2
@Nikolay - Đây chỉ là bản sao từ cheetahonfire.blogspot.com/2009/05/… mà tôi đã đọc. Có bất cứ điều gì thêm buổi hòa nhạc như tôi đã đọc các bài báo mâu thuẫn.
eb80,

5
Sự khác biệt chính là bước lựa chọn. Sẽ chọn sắp xếp chọn nhỏ nhất và giao dịch hoán đổi nó với một đầu tiên sắp xếp chèn chèn một hiện ở vị trí thích hợp của nó
Nikolay Kostov

6
@ eb80 Tôi không chắc bạn đang đọc tài liệu gì, nhưng tôi không thấy làm thế nào một ví dụ có thể cụ thể hơn thế này?
G. Bach

23
Nhưng những gì về số lượng hoán đổi? Lựa chọn luôn thực hiện n (n-1) / 2 so sánh, nhưng trong trường hợp xấu nhất, nó sẽ chỉ thực hiện n-1 hoán đổi. Trong trường hợp xấu nhất, Chèn sẽ thực hiện n (n-1) / 2 phép so sánh cũng như n (n-1) / 2 lần hoán đổi.
Jason Goemaat

2
@Adorn Cả hai đều không phải là thuật toán chia và chinh phục.
Asky McAskface

62

Cả sắp xếp chèn và sắp xếp lựa chọn đều có vòng lặp bên ngoài (trên mọi chỉ mục) và vòng lặp bên trong (trên một tập hợp con các chỉ số). Mỗi lần vượt qua của vòng lặp bên trong sẽ mở rộng vùng được sắp xếp theo một phần tử, với chi phí của vùng không được sắp xếp, cho đến khi hết phần tử chưa được sắp xếp.

Sự khác biệt là ở những gì vòng lặp bên trong làm:

  • Trong sắp xếp lựa chọn, vòng lặp bên trong nằm trên các phần tử chưa được sắp xếp . Mỗi đường chuyền chọn một phần tử và di chuyển phần tử đó đến vị trí cuối cùng của nó (ở cuối hiện tại của vùng được sắp xếp).

  • Trong sắp xếp chèn, mỗi lần vượt qua của vòng lặp bên trong sẽ lặp lại trên các phần tử được sắp xếp . Các phần tử đã sắp xếp được thay thế cho đến khi vòng lặp tìm được vị trí chính xác để chèn phần tử chưa được sắp xếp tiếp theo.

Vì vậy, trong một sắp xếp lựa chọn, các phần tử đã sắp xếp được tìm thấy theo thứ tự đầu ra và giữ nguyên khi chúng được tìm thấy. Ngược lại, trong một sắp xếp chèn, các phần tử không được sắp xếp sẽ được đặt cho đến khi tiêu thụ theo thứ tự đầu vào, trong khi các phần tử của vùng được sắp xếp tiếp tục di chuyển xung quanh.

Liên quan đến hoán đổi: sắp xếp lựa chọn thực hiện một hoán đổi cho mỗi lần vượt qua của vòng lặp bên trong. Sắp xếp chèn thường lưu phần tử được chèn như temp trước vòng lặp bên trong, để lại khoảng trống cho vòng lặp bên trong để dịch chuyển các phần tử đã được sắp xếp lên một, rồi sao chép tempvào điểm chèn sau đó.


23


SẮP XẾP LỰA CHỌN Giả sử rằng có một mảng số được viết theo kiểu cụ thể / ngẫu nhiên và giả sử chúng ta sắp xếp theo thứ tự tăng dần..vì vậy, hãy lấy một số tại một thời điểm và thay thế chúng bằng số nhỏ nhất. có sẵn trong danh sách. bằng cách thực hiện bước này, cuối cùng chúng ta sẽ nhận được kết quả mong muốn.

nhập mô tả hình ảnh ở đây



Sắp xếp chèn
Giữ giả định tương tự trong tâm trí nhưng sự khác biệt duy nhất là lần này chúng tôi sẽ chọn một trong số tại một thời điểm và chèn nó ở phần presorted, mà giảm sự so sánh và do đó là hiệu quả hơn.

nhập mô tả hình ảnh ở đây


Chỉ cần kiểm tra mycodeschool trên Youtube. Tuy nhiên, câu trả lời này khen ngợi những gì được giải thích trong video của 2 thuật toán trên youtube.
JaydeepW

21

Có thể nhầm lẫn là do bạn đang so sánh mô tả sắp xếp danh sách liên kết với mô tả sắp xếp một mảng . Nhưng tôi không thể chắc chắn, vì bạn đã không trích dẫn nguồn của bạn.

Cách dễ nhất để hiểu các thuật toán sắp xếp là thường có mô tả chi tiết về thuật toán (không phải những thứ mơ hồ như "loại này sử dụng hoán đổi. Ở đâu đó. Tôi không nói ở đâu"), lấy một số thẻ chơi (5-10 thẻ là đủ cho các thuật toán sắp xếp đơn giản) và chạy thuật toán bằng tay.

Sắp xếp lựa chọn: quét qua dữ liệu chưa được sắp xếp để tìm phần tử còn lại nhỏ nhất, sau đó hoán đổi nó vào vị trí ngay sau dữ liệu đã sắp xếp. Lặp lại cho đến khi hoàn thành. Nếu sắp xếp danh sách, bạn không cần hoán đổi phần tử nhỏ nhất vào vị trí, thay vào đó bạn có thể xóa nút danh sách khỏi vị trí cũ và chèn nó vào vị trí mới.

Sắp xếp chèn: lấy phần tử ngay sau dữ liệu đã sắp xếp, quét qua dữ liệu đã sắp xếp để tìm vị trí cần đặt và đặt nó ở đó. Lặp lại cho đến khi hoàn thành.

Sắp xếp chèn có thể sử dụng hoán đổi trong giai đoạn "quét" của nó, nhưng không cần thiết và đó không phải là cách hiệu quả nhất trừ khi bạn đang sắp xếp một mảng của kiểu dữ liệu: (a) không thể di chuyển, chỉ được sao chép hoặc hoán đổi; và (b) đắt hơn để sao chép hơn là hoán đổi. Nếu sắp xếp chèn sử dụng hoán đổi, cách thức hoạt động là bạn đồng thời tìm kiếm vị trí đặt phần tử mới ở đó, bằng cách hoán đổi liên tục phần tử mới với phần tử ngay trước nó, miễn là phần tử trước nó lớn hơn nó. Khi bạn tiếp cận một phần tử không lớn hơn, bạn đã tìm thấy vị trí chính xác và bạn chuyển sang phần tử mới tiếp theo.


1
Điều này rất hữu ích ... Đoạn cuối nói đến sự nhầm lẫn mà tôi đang gặp phải, bắt nguồn từ các biến thể trên mỗi loại.
eb80

1
1 cho lưu ý rằng sử dụng chèn sắp xếp trên một danh sách liên kết là một hiệu suất hoán đổi hoàn toàn khác so với một mảng tại chỗ
Gavin Achtemeier

11

Logic của cả hai thuật toán là khá giống nhau. Cả hai đều có một mảng con được sắp xếp một phần ở đầu mảng. Sự khác biệt duy nhất là cách họ tìm kiếm phần tử tiếp theo để đưa vào mảng đã sắp xếp.

  • Insertion sort : chèn phần tử tiếp theo vào đúng vị trí;

  • Lựa chọn sắp xếp : chọn phần tử nhỏ nhất và trao đổi nó với mục hiện tại;

Ngoài ra, Insertion Sort là ổn định, trái ngược với Selection Sort .

Tôi đã triển khai cả hai trong python và điều đáng chú ý là chúng giống nhau như thế nào:

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

Với một thay đổi nhỏ có thể thực hiện thuật toán Sắp xếp lựa chọn.

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

xin lỗi, tôi đã tự hỏi tại sao (thuật toán sắp xếp lựa chọn), dữ liệu [i] được trao đổi với dữ liệu [hiện tại] bất cứ khi nào dữ liệu [i] nhỏ hơn. Trong loại lựa chọn cơ bản / ban đầu (?), Chúng tôi tìm giá trị nhỏ nhất trong phạm vi (i, data_size) và trao đổi dữ liệu [i] với giá trị tối thiểu đó ... điều đó hơi khác một chút ...
Tony Ma

4

Tóm lại, tôi nghĩ rằng sắp xếp lựa chọn tìm kiếm giá trị nhỏ nhất trong mảng trước, sau đó thực hiện hoán đổi trong khi sắp xếp chèn nhận một giá trị và so sánh nó với từng giá trị còn lại của nó (đằng sau nó). Nếu giá trị nhỏ hơn, nó sẽ hoán đổi. Sau đó, cùng một giá trị được so sánh một lần nữa và nếu nó nhỏ hơn với giá trị phía sau, nó sẽ hoán đổi một lần nữa. Tôi hy vọng điều đó đúng!


4

Nói ngắn gọn,

Sắp xếp lựa chọn: Chọn phần tử đầu tiên từ mảng chưa được sắp xếp và so sánh nó với các phần tử chưa được sắp xếp còn lại. Nó tương tự như sắp xếp Bubble, nhưng thay vì hoán đổi từng phần tử nhỏ hơn, hãy cập nhật chỉ mục phần tử nhỏ nhất và hoán đổi nó ở cuối mỗi vòng lặp .

Sắp xếp chèn: Nó ngược lại với sắp xếp Lựa chọn trong đó nó chọn phần tử đầu tiên từ mảng con chưa được sắp xếp và so sánh nó với mảng con đã sắp xếp và chèn phần tử nhỏ nhất vào nơi tìm thấy và chuyển tất cả các phần tử đã sắp xếp từ bên phải của nó sang phần tử chưa được sắp xếp đầu tiên.


3

Tôi sẽ thử một lần nữa: hãy xem xét điều gì xảy ra trong trường hợp may mắn của mảng gần như được sắp xếp.

Trong khi sắp xếp, mảng có thể được coi là có hai phần: bên trái - đã sắp xếp, bên phải - chưa sắp xếp.

Sắp xếp chèn - chọn phần tử chưa được sắp xếp đầu tiên và cố gắng tìm vị trí cho phần tử đó trong số phần đã được sắp xếp. Vì bạn tìm kiếm từ phải sang trái nên rất có thể xảy ra trường hợp phần tử được sắp xếp đầu tiên mà bạn đang so sánh (phần tử lớn nhất, bên phải nhất ở phần bên trái) nhỏ hơn phần tử đã chọn nên bạn có thể ngay lập tức tiếp tục với phần tử chưa được sắp xếp tiếp theo.

Sắp xếp lựa chọn - chọn phần tử chưa được sắp xếp đầu tiên và cố gắng tìm phần tử nhỏ nhất của toàn bộ phần chưa được sắp xếp và trao đổi hai phần tử đó nếu muốn. Vấn đề là, vì phần bên phải không được sắp xếp, bạn phải suy nghĩ từng phần tử, vì bạn không thể chắc chắn liệu có hay không phần tử nhỏ hơn phần đã chọn.

Btw., Đây chính xác là những gì heapsort được cải thiện khi sắp xếp lựa chọn - nó có thể tìm phần tử nhỏ nhất nhanh hơn nhiều nhờ vào heap .


3

Sắp xếp theo lựa chọn: Khi bạn bắt đầu xây dựng danh sách con được sắp xếp, thuật toán đảm bảo rằng danh sách con được sắp xếp luôn được sắp xếp hoàn toàn, không chỉ về mặt các phần tử của riêng nó mà còn về mặt mảng hoàn chỉnh, tức là cả danh sách con được sắp xếp và chưa được sắp xếp. Vì vậy, phần tử nhỏ nhất mới khi được tìm thấy từ danh sách con chưa được sắp xếp sẽ chỉ được thêm vào cuối danh sách con đã sắp xếp.

Sắp xếp chèn: Thuật toán lại chia mảng thành hai phần, nhưng ở đây phần tử được chọn từ phần thứ hai và chèn vào đúng vị trí của phần đầu tiên. Điều này không bao giờ đảm bảo rằng phần đầu tiên được sắp xếp theo mảng hoàn chỉnh, mặc dù tất nhiên trong lần chuyển cuối cùng, mọi phần tử đều ở đúng vị trí được sắp xếp của nó.


3

Cả hai thuật toán thường hoạt động như thế này

Bước 1: Lấy phần tử chưa được sắp xếp tiếp theo từ danh sách chưa được sắp xếp, sau đó

Bước 2: Đặt nó vào đúng vị trí trong danh sách đã sắp xếp.

Một trong các bước sẽ dễ dàng hơn cho một thuật toán và ngược lại.

Sắp xếp chèn : Chúng tôi lấy phần tử đầu tiên của danh sách chưa được sắp xếp, đặt nó vào danh sách đã sắp xếp, ở đâu đó . Chúng tôi biết vị trí để lấy phần tử tiếp theo (vị trí đầu tiên trong danh sách chưa được sắp xếp), nhưng nó đòi hỏi một số công việc để tìm vị trí đặt nó ( ở đâu đó ). Bước 1 rất dễ dàng.

Sắp xếp lựa chọn : Chúng ta lấy phần tử ở đâu đó từ danh sách chưa được sắp xếp, sau đó đặt nó ở vị trí cuối cùng của danh sách đã sắp xếp. Chúng ta cần tìm phần tử tiếp theo (rất có thể nó không nằm ở vị trí đầu tiên của danh sách chưa được sắp xếp, mà là ở đâu đó ) sau đó đặt nó ngay cuối danh sách đã sắp xếp. Bước 2 thật dễ dàng


2

Vòng lặp bên trong của sắp xếp chèn đi qua các phần tử đã được sắp xếp (trái với sắp xếp lựa chọn). Điều này cho phép nó hủy bỏ vòng lặp bên trong khi tìm thấy đúng vị trí . Có nghĩa là:

  1. Vòng lặp bên trong sẽ chỉ đi qua một nửa số phần tử của nó trong trường hợp trung bình.
  2. Vòng lặp bên trong sẽ bị hủy bỏ thậm chí sớm hơn nếu mảng gần như được sắp xếp.
  3. Vòng lặp bên trong sẽ hủy bỏ ngay lập tức nếu mảng đã được sắp xếp, làm cho độ phức tạp của sắp xếp chèn tuyến tính trong trường hợp này.

Việc sắp xếp lựa chọn sẽ phải luôn đi qua tất cả các phần tử vòng lặp bên trong. Đó là lý do tại sao kiểu chèn được ưu tiên hơn kiểu chọn. Nhưng mặt khác, kiểu lựa chọn thực hiện ít hoán đổi phần tử hơn nhiều, điều này có thể quan trọng hơn trong một số trường hợp.


1

Về cơ bản, sắp xếp chèn hoạt động bằng cách so sánh hai phần tử tại một thời điểm và sắp xếp lựa chọn chọn phần tử tối thiểu từ toàn bộ mảng và sắp xếp nó.

Sắp xếp chèn theo khái niệm tiếp tục sắp xếp danh sách phụ bằng cách so sánh hai phần tử cho đến khi toàn bộ mảng được sắp xếp trong khi sắp xếp lựa chọn chọn phần tử tối thiểu và hoán đổi nó ở vị trí đầu tiên phần tử tối thiểu thứ hai sang vị trí thứ hai, v.v.

Sắp xếp chèn có thể được hiển thị như sau:

    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;

Sắp xếp lựa chọn có thể được hiển thị như sau:

    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;

1

Việc lựa chọn 2 thuật toán sắp xếp này phụ thuộc vào cấu trúc dữ liệu được sử dụng.

Khi bạn đang sử dụng mảng, hãy sử dụng sắp xếp lựa chọn (mặc dù tại sao, khi nào bạn có thể sử dụng qsort?). Khi bạn đang sử dụng danh sách được liên kết, hãy sử dụng sắp xếp chèn.

Điều này là do:

  • Truyền qua danh sách được liên kết đắt hơn mảng.
  • Chèn danh sách liên kết rẻ hơn nhiều so với mảng.

Sắp xếp chèn chèn giá trị mới vào giữa phân đoạn đã sắp xếp. Do đó, dữ liệu cần được "đẩy lùi". Tuy nhiên, khi bạn đang sử dụng danh sách liên kết, bằng cách vặn 2 con trỏ, bạn đã đẩy toàn bộ danh sách trở lại một cách hiệu quả. Trong một mảng, bạn phải thực hiện hoán đổi n-i để đẩy các giá trị trở lại, điều này có thể rất tốn kém.

Sắp xếp lựa chọn luôn nối với cuối, vì vậy nó không gặp vấn đề này khi sử dụng mảng. Do đó, dữ liệu không cần phải được "đẩy lùi".


0

Một lời giải thích đơn giản có thể như sau:

Đã cho : Một mảng hoặc danh sách số chưa được sắp xếp.

Câu lệnh Vấn đề : Để sắp xếp danh sách / mảng số theo thứ tự tăng dần để hiểu sự khác biệt giữa Sắp xếp Lựa chọn và Sắp xếp Chèn.

Sắp xếp chèn:Bạn xem danh sách từ trên xuống dưới để dễ hiểu hơn. Chúng tôi coi yếu tố đầu tiên là giá trị tối thiểu ban đầu của chúng tôi. Bây giờ, ý tưởng là chúng ta duyệt qua tuyến tính từng chỉ mục của danh sách / mảng đó để tìm xem có bất kỳ phần tử nào khác trong bất kỳ chỉ mục nào có giá trị nhỏ hơn giá trị nhỏ nhất ban đầu hay không. Nếu chúng tôi tìm thấy một giá trị như vậy, chúng tôi chỉ cần hoán đổi các giá trị tại các chỉ mục của chúng, tức là giả sử 15 là giá trị ban đầu nhỏ nhất ở chỉ mục 1 và trong quá trình duyệt tuyến tính của các chỉ mục, chúng ta gặp một số có giá trị nhỏ hơn, ví dụ như 7 ở chỉ số 9 Bây giờ, giá trị 7 này ở chỉ số 9 được hoán đổi với chỉ số 1 có 15 là giá trị của nó. Truyền tải này sẽ tiếp tục so sánh giá trị của chỉ mục hiện tại với các chỉ mục còn lại để hoán đổi cho giá trị nhỏ hơn. Điều này tiếp tục cho đến chỉ mục cuối cùng thứ hai của danh sách / mảng,

Sắp xếp lựa chọn:Giả sử rằng phần tử chỉ mục đầu tiên của danh sách / mảng được sắp xếp. Bây giờ từ phần tử ở chỉ mục thứ hai, chúng tôi so sánh nó với chỉ mục trước đó của nó để xem giá trị có nhỏ hơn không. Việc truyền tải có thể được hình dung thành hai phần, được sắp xếp và không được sắp xếp. Người ta sẽ hình dung một kiểm tra so sánh từ không được sắp xếp đối với được sắp xếp cho một chỉ mục nhất định trong danh sách / mảng. Giả sử bạn có giá trị 19 ở chỉ mục 1 và giá trị 10 ở chỉ mục 3. Chúng tôi coi việc truyền tải từ không được sắp xếp sang được sắp xếp, tức là từ phải sang trái. Vì vậy, giả sử chúng ta phải sắp xếp ở chỉ mục 3. Chúng ta thấy rằng nó có giá trị nhỏ hơn chỉ mục 1 khi chúng ta so sánh từ phải sang trái. Sau khi xác định được, chúng ta chỉ cần đặt số 10 của chỉ mục 3 vào vị trí của chỉ số 1 có giá trị 19. Giá trị ban đầu 19 ở chỉ mục 1 sẽ bị dịch chuyển sang phải một chỗ.

Tôi chưa thêm bất kỳ mã nào vì câu hỏi có vẻ như về việc hiểu khái niệm về phương thức truyền tải.


0

Sắp xếp chèn không hoán đổi mọi thứ. Mặc dù nó sử dụng biến tạm thời, Điểm lợi của việc sử dụng temp var là khi chúng tôi tìm thấy giá trị tại chỉ mục nhỏ hơn so với giá trị của chỉ mục trước đó, chúng tôi chuyển giá trị lớn hơn sang vị trí của giá trị nhỏ hơn chỉ mục sẽ ghi nhiều thứ hơn. Sau đó, chúng tôi sử dụng var tạm thời được thay thế ở chỉ mục trước đó. Ví dụ: 10, 20, 30, 50, 40. lần lặp 1: 10, 20, 30, 50, 50. [temp = 40] lần lặp 2: 10,20, 30, 40 (giá trị tạm thời), 50. Vì vậy, chúng tôi chỉ cần chèn một giá trị ở vị trí mong muốn từ một số biến.

Nhưng khi chúng tôi xem xét sắp xếp lựa chọn, trước tiên chúng tôi thấy chỉ mục có giá trị thấp hơn và hoán đổi giá trị đó với giá trị từ chỉ mục đầu tiên và tiếp tục hoán đổi liên tục cho đến khi tất cả các chỉ số được sắp xếp. Điều này hoàn toàn giống với việc hoán đổi hai số truyền thống. Ví dụ: 30, 20, 10, 40, 50. Lặp lại 1: 10, 20, 30, 40, 50. Ở đây temp var được sử dụng riêng để hoán đổi.



0

Điểm chung của cả hai là cả hai đều sử dụng một phân vùng để phân biệt giữa phần được sắp xếp của mảng và phần chưa được sắp xếp.

Sự khác biệt là, với sắp xếp lựa chọn, bạn được đảm bảo rằng một phần được sắp xếp của mảng sẽ không thay đổi khi thêm các phần tử vào phân vùng đã sắp xếp.

Lý do là vì lựa chọn tìm kiếm tối thiểu của tập hợp chưa được sắp xếp và thêm nó ngay sau phần tử cuối cùng của tập hợp đã sắp xếp, do đó tăng tập hợp đã sắp xếp lên 1.

Mặt khác, phần chèn chỉ quan tâm đến phần tử tiếp theo gặp phải, phần tử đầu tiên trong phần chưa được sắp xếp của mảng. Nó sẽ lấy phần tử này và chỉ cần lắp nó vào đúng vị trí của nó trong tập hợp đã sắp xếp.

Sắp xếp chèn thường sẽ luôn là ứng cử viên tốt hơn cho các mảng chỉ được sắp xếp một phần vì bạn đang lãng phí các thao tác để tìm giá trị tối thiểu.

Phần kết luận:

Sắp xếp lựa chọn tăng dần một phần tử vào cuối bằng cách tìm phần tử tối thiểu trong phần không được sắp xếp.

Sắp xếp chèn truyền phần tử đầu tiên được tìm thấy trong phần chưa được sắp xếp vào bất kỳ đâu trong phần được sắp xếp.


0

Mặc dù Độ phức tạp Thời gian của sắp xếp lựa chọn và sắp xếp chèn là như nhau, đó là n (n - 1) / 2. Loại chèn hiệu suất trung bình tốt hơn. Thử nghiệm trên cpu i5 của tôi với 30000 số nguyên ngẫu nhiên, sắp xếp lựa chọn mất trung bình 1,5 giây, trong khi sắp xếp chèn mất trung bình 0,6 giây.


Chào mừng bạn đến với StackOverflow và cảm ơn bạn đã trả lời. Nhiều khả năng bạn có thể thấy rằng nhiều người đã đóng góp những câu trả lời hay bằng hình ảnh minh họa. Ví dụ Nikolay Kostov 7 năm trước đã nói rằng độ phức tạp thời gian là như nhau chỉ trong trường hợp xấu nhất đối với sắp xếp chèn. Nếu bạn cho rằng anh ấy sai, chúng tôi hoan nghênh bạn mở rộng câu trả lời của mình với nhiều chi tiết hơn.
Maxim Sagaydachny

-1

Theo thuật ngữ của giáo dân, (và có lẽ là cách dễ nhất để đạt được hiểu biết cao về vấn đề)

Sắp xếp bong bóng tương tự như đứng thành hàng và cố gắng sắp xếp theo chiều cao. Bạn tiếp tục chuyển đổi với người bên cạnh cho đến khi bạn đến đúng nơi. Điều này diễn ra theo mọi cách từ bên trái (hoặc bên phải tùy thuộc vào việc triển khai) và bạn tiếp tục chuyển đổi cho đến khi mọi người được sắp xếp.

Tuy nhiên, trong phân loại lựa chọn, những gì bạn đang làm tương tự như sắp xếp một bàn bài. Bạn nhìn vào thẻ, lấy thẻ nhỏ nhất, đặt nó sang trái, v.v.


3
Mặc dù vậy, anh ấy đang hỏi về sự khác biệt giữa loại Lựa chọn và Chèn
XuDing

-1

lựa chọn - chọn một mục cụ thể (thấp nhất) và hoán đổi nó với phần tử thứ i (không lặp lại). (tức là, thứ nhất, thứ hai, thứ ba .......), do đó, làm cho danh sách được sắp xếp ở một bên.

chèn- so sánh thứ nhất với thứ hai so sánh thứ ba với thứ hai & thứ nhất so sánh thứ tư với thứ ba, thứ hai & thứ nhất ......

một liên kết nơi tất cả các phân loại được so sánh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.