Trước hết, bạn có quyền truy cập out-of-bounds:
for(int j=0; j<a.length; j++) {
if(a[j] > a[j+1]) {
cho j == a.length-1
, vì vậy điều kiện vòng lặp nên thà làm j < a.length-1
.
Nhưng, trong Bubble sort, bạn biết rằng sau khi k
đèo, các k
yếu tố lớn nhất đều được sắp xếp tại các mục cuối cùng k
của mảng, do đó Bubble sort thường sử dụng
public static void bubblesort(int[] a) {
for(int i=1; i<a.length; i++) {
boolean is_sorted = true;
for(int j=0; j < a.length - i; j++) { // skip the already sorted largest elements
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
is_sorted = false;
}
}
if(is_sorted) return;
}
}
Bây giờ, mà có thể vẫn thực hiện nhiều lần lặp không cần thiết khi mảng có đuôi được sắp xếp dài của các phần tử lớn nhất, giả sử bạn có k,k-1,...,1
là các phần tử k
đầu tiên và k+1
đến 100000000
theo thứ tự sau đó. Loại Bubble tiêu chuẩn sẽ vượt qua k
lần thông qua (gần như) toàn bộ mảng.
Nhưng nếu bạn nhớ nơi bạn đã thực hiện hoán đổi cuối cùng của bạn, bạn biết rằng sau khi chỉ số đó, có những yếu tố lớn nhất trong trật tự, vì vậy
public static void bubblesort(int[] a) {
int lastSwap = a.length-1;
for(int i=1; i<a.length; i++) {
boolean is_sorted = true;
int currentSwap = -1;
for(int j=0; j < lastSwap; j++) {
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
is_sorted = false;
currentSwap = j;
}
}
if(is_sorted) return;
lastSwap = currentSwap;
}
}
sẽ sắp xếp các ví dụ trên chỉ với một đường chuyền thông qua toàn bộ mảng, và phần còn lại chỉ đi qua một tiền tố (ngắn).
Tất nhiên, nói chung, điều đó sẽ không mua cho bạn nhiều, nhưng sau đó tối ưu hóa một loại Bubble là một bài tập khá vô ích anyway.
Làm thế nào bạn có thể biết rằng họ đã được sắp xếp? – Pol0nium
bạn đang đề cập đến is_sorted? nó chỉ là một lá cờ – kent
@ Pol0nium: bởi vì một con người thấy điều này. Câu hỏi đặt ra là làm thế nào để làm cho các thuật toán thấy rằng –