Thuật toán sắp xếp chèn vào Java với ví dụ về chương trình

⚡ Tóm tắt thông minh

Sắp xếp chèn trong Java Phương pháp này xây dựng một phần mảng đã được sắp xếp từng phần tử một, dịch chuyển các giá trị lớn hơn sang phải cho đến khi mỗi khóa nằm ở vị trí chính xác của nó, lý tưởng cho các tập dữ liệu nhỏ.

  • 🔘 Định nghĩa: Thuật toán sắp xếp chèn loại bỏ một phần tử và chèn nó vào đúng vị trí của nó trong phần đã được sắp xếp.
  • ☑️ Quá trình: Mỗi lượt sẽ so sánh khóa với các giá trị trước đó và dịch chuyển các giá trị lớn hơn sang phải một vị trí.
  • Chương trình: Java Ví dụ này sắp xếp tập hợp {860, 8, 200, 9} và in ra từng phép so sánh và hoán đổi.
  • 🧪 Phức tạp: Trường hợp tốt nhất chạy trong thời gian O(n), trong khi trường hợp trung bình và trường hợp xấu nhất đạt đến O(n²).
  • 🛠️ Bộ nhớ: Việc sắp xếp diễn ra tại chỗ, do đó không gian phụ trợ vẫn ở mức O(1) cho bất kỳ kích thước mảng nào.
  • 📊 Hành vi: Thuật toán này ổn định và có khả năng thích ứng, do đó các mảng gần như đã được sắp xếp hoàn tất chỉ sau rất ít thao tác dịch chuyển.

Thuật toán sắp xếp chèn vào Java

Thuật toán sắp xếp chèn là gì?

Sắp xếp chèn là một thuật toán sắp xếp đơn giản phù hợp với các tập dữ liệu nhỏ. Trong mỗi lần lặp, thuật toán:

  • Loại bỏ một phần tử khỏi một mảng.
  • So sánh nó với giá trị lớn nhất trong mảng.
  • Di chuyển phần tử đến đúng vị trí của nó.

Hành vi này phản ánh cách người chơi bài sắp xếp bài: mỗi lá bài mới được nhặt lên và đẩy sang trái, vượt qua mọi lá bài lớn hơn cho đến khi nó nằm đúng vị trí. Vì tất cả các thao tác dịch chuyển đều diễn ra bên trong mảng ban đầu, nên thuật toán sắp xếp chèn vừa thực hiện tại chỗ vừa ổn định.

Nó thuộc cùng một dòng sản phẩm thân thiện với người mới bắt đầu. Java các quy trình sắp xếp như phân loại bong bóngTuy nhiên, nó thường thực hiện ít thao tác ghi hơn trên dữ liệu đã được sắp xếp một phần.

Quy trình thuật toán sắp xếp chèn

Đây là cách quy trình thuật toán sắp xếp chèn hoạt động bằng đồ họa:

Animated tracVí dụ về thuật toán sắp xếp chèn nhằm sắp xếp lại một danh sách chưa được sắp xếp.
Quy trình thuật toán sắp xếp chèn

Hoạt hình lặp lại ba bước giống nhau. Java Chương trình bên dưới thực hiện. Bảng chạy thử tracHãy thực hiện các bước đó trên mảng mẫu {860, 8, 200, 9}, chính xác như chương trình in ra khi chạy.

Qua Yếu tố quan trọng Các so sánh đã được thực hiện Mảng sau khi truyền
1 8 8 chọi 860 8 860 200 9
2 200 200 chọi 860 8 200 860 9
3 9 9 đấu với 860, sau đó 9 đấu với 200. 8 9 200 860

Lưu ý rằng lượt 3 cần hai phép so sánh vì khóa 9 phải đi qua hai giá trị lớn hơn. Do đó, số lượng phép so sánh tăng lên tùy thuộc vào khoảng cách mà mỗi phần tử bắt đầu ở vị trí không đúng thứ tự.

Java Ví dụ chương trình để sắp xếp một mảng bằng thuật toán sắp xếp chèn:

Chương trình bên dưới sắp xếp mảng {860, 8, 200, 9} và in ra chú thích liên tục, để mọi phép so sánh và mọi thao tác dịch chuyển đều được hiển thị. Hãy lưu nó dưới dạng [tên tệp]. InsertionSortExample.java và biên dịch nó với bất kỳ phiên bản JDK 8 trở lên nào.

package com.guru99;
 
public class InsertionSortExample {
 
	
    public static void main(String a[])
    {    
        int[] myArray  = {860,8,200,9};  
        
        System.out.println("Before Insertion Sort");  
        
        printArray(myArray);
            
        insertionSort(myArray);//sorting array using insertion sort    
           
        System.out.println("After Insertion Sort");  
        
        printArray(myArray);   
    }    
 public static void insertionSort(int arr[]) 
	{  
        int n = arr.length;  
        
        for (int i = 1; i < n; i++)
        {   System.out.println("Sort Pass Number "+(i));
            int key = arr[i];  
            int j = i-1;  
            
            while ( (j > -1) && ( arr [j] > key ) ) 
            {  
            System.out.println("Comparing "+ key  + " and " + arr [j]); 
                arr [j+1] = arr [j];  
                j--;  
            }  
            arr[j+1] = key; 
            System.out.println("Swapping Elements: New Array After Swap");
            printArray(arr);
        }  
    }
 static void printArray(int[] array){
	    
	    for(int i=0; i < array.length; i++)
		{  
			System.out.print(array[i] + " ");  
		} 
	    System.out.println();
	    
	}
}

Việc chạy lớp học tạo ra trace được hiển thị ở đây. Mỗi Số thứ tự sắp xếp Dòng này đánh dấu một lần lặp của vòng lặp ngoài, và dòng được in sau mỗi lần hoán đổi cho thấy mảng ở trạng thái hiện tại.

Code Đầu ra:

Before Insertion Sort
860 8 200 9 
Sort Pass Number 1
Comparing 8 and 860
Swapping Elements: New Array After Swap
8 860 200 9 
Sort Pass Number 2
Comparing 200 and 860
Swapping Elements: New Array After Swap
8 200 860 9 
Sort Pass Number 3
Comparing 9 and 860
Comparing 9 and 200
Swapping Elements: New Array After Swap
8 9 200 860 
After Insertion Sort
8 9 200 860

Độ phức tạp về thời gian và không gian của thuật toán sắp xếp chèn

Hiệu năng của thuật toán sắp xếp chèn phụ thuộc rất nhiều vào mức độ sắp xếp sẵn có của dữ liệu đầu vào, đó là lý do tại sao trường hợp tốt nhất và trường hợp tệ nhất lại chênh lệch nhau cả một bậc về mức độ tăng trưởng.

Khay Điều kiện đầu vào Thời gian phức tạp
Tốt Mảng đã được sắp xếp, do đó vòng lặp while bên trong sẽ không bao giờ chạy. O (n)
Trung bình Các phần tử xuất hiện theo thứ tự ngẫu nhiên O (n²)
tệ nhất Mảng được sắp xếp ngược, do đó mỗi khóa sẽ được đưa lên đầu. O (n²)

Việc sử dụng không gian đơn giản hơn nhiều. Chỉ có các quầy. i, j, nkey được tạo ra và mảng được sắp xếp lại tại chỗ, do đó không gian phụ trợ là O(1) bất kể đầu vào lớn đến mức nào.

Vì vòng lặp bên trong dừng lại ngay khi gặp giá trị nhỏ hơn, thuật toán sắp xếp chèn được mô tả là thích ứng: dữ liệu đầu vào càng gần với thứ tự đã được sắp xếp, thời gian thực thi càng tiến gần đến tuyến tính.

Ưu điểm và nhược điểm của sắp xếp chèn

Thuật toán sắp xếp chèn vẫn được sử dụng trong các thư viện thực tế mặc dù có trường hợp trung bình bậc hai, bởi vì các hằng số của nó rất nhỏ và hành vi của nó có thể dự đoán được.

Ưu điểm

  • Dễ viết và dễ hiểu tracViết tay, rất phù hợp cho việc giảng dạy và phỏng vấn.
  • Ổn định, vì vậy các bản ghi có chung khóa sẽ giữ nguyên thứ tự tương đối ban đầu của chúng.
  • Tại chỗ, chỉ cần thêm bộ nhớ O(1) ngoài mảng đầu vào.
  • Có khả năng thích ứng, đạt độ phức tạp O(n) trên dữ liệu đã được sắp xếp gần như hoàn chỉnh.
  • Trực tuyến, có nghĩa là nó có thể sắp xếp danh sách trong khi các phần tử mới vẫn đang được thêm vào.

Nhược điểm

  • Thời gian xử lý bậc hai đối với dữ liệu đầu vào ngẫu nhiên hoặc được sắp xếp ngược khiến nó không phù hợp với các mảng lớn.
  • Mỗi thao tác dịch chuyển ghi vào mảng, do đó nó di chuyển nhiều dữ liệu hơn so với thuật toán sắp xếp chọn.
  • Thuật toán sắp xếp trộn (Merge sort) và sắp xếp nhanh (Quicksort) hoạt động hiệu quả hơn hẳn khi số lượng phần tử đầu vào vượt quá vài chục.

Một nguyên tắc thực tiễn là nên sử dụng thuật toán sắp xếp chèn khi mảng nhỏ, khi dữ liệu gần như đã được sắp xếp theo thứ tự, hoặc khi thuật toán sắp xếp chia để trị đã giảm một phân vùng xuống chỉ còn một vài phần tử.

Thuật toán sắp xếp chèn so với Bubble Sort so với Selection Sort

Cả ba thuật toán đều là thuật toán sắp xếp so sánh bậc hai, tuy nhiên chúng khác nhau về độ ổn định, cách phản ứng với dữ liệu đầu vào có thứ tự và số lần ghi mà chúng thực hiện.

Tiêu chí Sắp xếp chèn Bubble Sắp xếp Sắp xếp lựa chọn
Trường hợp tốt nhất O (n) O(n) với cờ thoát sớm O (n²)
trường hợp trung bình và trường hợp xấu nhất O (n²) O (n²) O (n²)
Không gian thêm O (1) O (1) O (1)
Ổn định Không, trong phiên bản mảng tiêu chuẩn
Thích nghi Đúng vậy, khi sử dụng phương pháp tối ưu hóa cờ. Không
Ghi vào mảng Nhiều ca làm việc, nhưng ít ca dựa trên dữ liệu đã được sắp xếp. Nhiều cuộc trao đổi Chính xác n-1 lần hoán đổi

Thuật toán sắp xếp chọn (Selection sort) thắng thế khi thao tác ghi tốn kém, vì nó thực hiện ít thao tác hoán đổi nhất. Thuật toán sắp xếp chèn (Insertion sort) thắng thế ở hầu hết mọi trường hợp khác ở quy mô này, đặc biệt là trên dữ liệu được sắp xếp một phần, đó là lý do tại sao các thuật toán sắp xếp trong thư viện như thuật toán được đề cập ở trên lại hiệu quả. chung Java bài tập và các thành phần nội bộ của JDK sẽ chuyển sang sử dụng nó cho các phân vùng rất nhỏ.

Câu Hỏi Thường Gặp

Riêng phần tử đầu tiên đã là một mảng con được sắp xếp có độ dài là một. Bắt đầu từ chỉ mục 1 có nghĩa là vòng lặp luôn có thứ để so sánh, vì vậy khóa ở vị trí i được chèn vào khối được sắp xếp ở bên trái của nó.

Trợ lý AI có thể tường thuật lại quá trình chạy thử từng dòng, tạo thêm các mảng kiểm thử và ước tính sự tăng trưởng Big O từ mã nguồn. Hãy coi lời giải thích này như một công cụ hỗ trợ học tập và xác nhận độ phức tạp so với sách giáo khoa trước khi trích dẫn.

Vâng. Trợ lý GitHub Hoàn thành thuật toán sắp xếp chèn tiêu chuẩn từ chữ ký phương thức hoặc chú thích. RevHãy tự xem xét các điều kiện biên, vì các vòng lặp được tạo ra đôi khi sử dụng j >= 0 hoặc j > -1 không nhất quán với mã xung quanh.

Thuật toán sắp xếp chèn nhị phân xác định điểm chèn bằng cách tìm kiếm nhị phân thay vì quét tuyến tính, giảm số phép so sánh trên mỗi phần tử từ O(n) xuống O(log n). Công việc dịch chuyển không thay đổi, do đó độ phức tạp thời gian tổng thể vẫn là O(n²).

Đúng vậy. Phiên bản đệ quy sắp xếp n-1 phần tử đầu tiên, sau đó chèn phần tử cuối cùng vào tiền tố đã được sắp xếp đó. Nó có độ phức tạp thời gian tương đương với phiên bản lặp nhưng thêm không gian ngăn xếp O(n), vì vậy phiên bản vòng lặp được ưu tiên hơn trong thực tế.

Một phần. Thuật toán quicksort hai điểm neo dùng cho các kiểu dữ liệu nguyên thủy sẽ chuyển sang kiểu sắp xếp chèn khi phân vùng rất nhỏ, còn TimSort, dùng cho các đối tượng, sẽ sắp xếp các đoạn ngắn bằng thuật toán sắp xếp chèn nhị phân trước khi hợp nhất chúng.

Các lỗi thường gặp là bắt đầu vòng lặp ngoài ở vị trí 0, viết arr[j] = key thay vì arr[j+1] = key, và bỏ qua điều kiện j > -1, dẫn đến lỗi ArrayIndexOutOfBoundsException khi khóa thuộc về vị trí 0.

Đúng vậy. Thay thế phép kiểm tra lớn hơn bằng compareTo cho kiểu Comparable, hoặc bằng một lệnh gọi Comparator. Logic dịch chuyển vẫn không thay đổi và tính ổn định được bảo toàn, điều này rất quan trọng khi các đối tượng có cùng khóa sắp xếp.

Tóm tắt bài viết này với: