Hỏi về lệnh rand() trong Quicksort

Dưới đây là một đoạn code em học trên VNOI.
Em thắc mắc ở chỗ dùng hàm rand() vì nếu viết như trong ảnh thì pivot sẽ có giá trị trong khoảng từ
[ left ; right-1 ] . Vậy khi left=right thì lệnh trong ảnh sẽ sai ?
Em nghĩ đáng lẽ lệnh trong ảnh phải là int pivot = a[left + rand() % (right - left + 1)]; chứ ?

Tuy vậy em đã chạy thử code trong ảnh nhưng vẫn cho kết quả đúng.
Nhờ mấy bác giải thích giúp em tại sao lại như vậy ?

Bạn truyền left right bằng nhau vào sẽ bị lỗi vì lấy mod với 0 (hay chia 0 lấy dư - chia cho 0 đã là sai rồi)

Chính xác.

6 Likes

Bác ơi, nếu như vậy thì khi hàm quickSort() gọi đệ quy mãi đến trường hợp left = right thì nó phải bị lỗi chứ ? Tại sao em chạy nó vẫn cho kết quả đúng vậy bác?
Mong bác giải đáp giúp em.

Vì sẽ không có lời gọi đệ quy nào mà left bằng right:
if (left < j) quickSort(a, left, j);
if (i < right) quickSort(a, i, right);

Nhưng code vẫn sai vì không sắp xếp được dãy 1 phần tử.

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?