Tôi đang đọc thuật toán sắp xếp nhanh trong sách của Robert Sedwick Thuật toán và cấu trúc dữ liệu phần 1-4.Cải tiến thuật toán sắp xếp nhanh nếu có nhiều phím trùng lặp hơn
template <class item>
static void quicksort(item [] a, int l, int r)
{
if(r <= l) return;
int i = partition(a,l,r);
quicksort(a, l, i-1);
quicksort(a, i+1, r);
}
template <class item>
int partition(item a[], int l, int r)
{
int i = l-1; j = r; item v = a[r];
for(;;) {
while(a[++i] < v);
while(v < a[--j])
if(j == l)
break;
if(i >= j)
break; // pointer crossing.
exch(a[i], a[j]);
}
exch(a[i], a[r]);
return i;
}
Sách có văn bản sau đây trên thuật toán trên.
Khi khóa trùng lặp có trong tệp, con trỏ qua là tinh tế. chúng tôi có thể cải thiện quá trình phân vùng một chút bằng cách chấm dứt quét khi tôi < j, và sau đó sử dụng j, thay vì i-1, để phân định đầu bên phải của tập tin con bên trái cho cuộc gọi đầu tiên đệ quy . Cho phép vòng lặp lặp lại một lần nữa trong trường hợp này là cải thiện , bởi vì, khi các vòng quét kết thúc với j và tôi đề cập đến cùng một phần tử, chúng ta kết thúc với hai phần tử trong vị trí cuối cùng của chúng: phần tử đã dừng cả hai bản quét phải có do đó bằng với phần tử phân đoạn và chính phần tử phân đoạn . Thay đổi này có thể đáng để thực hiện, bởi vì, trong trường hợp cụ thể này, chương trình để lại một bản ghi với khóa bằng phím phân vùng trong [r] và điều này làm cho phân vùng đầu tiên trong cuộc gọi nhanh chóng , i + 1, r) thoái hóa, bởi vì phím phải nhất của nó là nhỏ nhất của nó.
Câu hỏi của tôi là
- Làm sao chúng ta có thể sửa đổi trên chương trình với mô tả dưới đây? Tôi đang gặp khó khăn trong việc sửa đổi nó để hiểu văn bản.
- Tại sao thuật toán sắp xếp nhanh không hoạt động hiệu quả nếu có nhiều khóa trùng lặp hơn.
- Cách sửa đổi ở trên cải thiện nếu có thêm nhiều phím sao chép?
- Tác giả có ý nghĩa gì khi "phân đoạn đầu tiên trong phân loại nhanh cuộc gọi (a, i + 1, r) thoái hóa, vì khóa chính của nó là nhỏ nhất." ? tác giả có nghĩa là gì khi thoái hóa ở đây?
Cảm ơn bạn đã dành thời gian và trợ giúp.
@Clare Macrae: Đây không phải là bài tập về nhà. Tôi tự đọc cuốn sách này và có một câu hỏi ở trên. – venkysmarty