01/10/2018, 13:37

Thắc mắc Selection Sort?

cách viết sort như thế này thì sai ở đâu nhỉ?


void selectionSort(int Arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
       int min = Arr[i];
        for (int j = i + 1; j < n; j++) {
            if (min > Arr[j]) {
                min = Arr[j];
            }
        }
        swap(min, Arr[i]);
    }
}
rogp10 viết 15:42 ngày 01/10/2018

Ngay sau đó min bị ghi đè nên câu lệnh không khác Arr[i] = min;, điều này vi pham một ràng buộc tối quan trọng của các thuật toán sắp xếp: output phải là hoán vị không giảm của input với thứ tự <= toàn phần cho trước, và riêng với thuật toán này thì một bất biến đã bị vi phạm: sau mỗi vòng, thành phẩm phải là hoán vị của đầu vào.

Trần Hoàn viết 15:53 ngày 01/10/2018

Mấy cái code sort O(n^2) thì cứ lên google rồi copypasta cho nhanh, tự viết làm gì mất công suy nghĩ

rogp10 viết 15:51 ngày 01/10/2018

Đến thế thì std::sort cho rồi đang học mà.

Trần Hoàn viết 15:47 ngày 01/10/2018

Các hàm sort thường không dùng swap(min, A[i]) mà thường là swap(&A[j], &A[i]) hay đại loại thế.

ĐẸP TRAI viết 15:42 ngày 01/10/2018

có link chi tiết không ban?

Black viết 15:37 ngày 01/10/2018

Mình thấy cái này cũng đúng mà selection sort thì nó lưu vị trí còn bạn lưu giá trị có khác nhau là mấy đâu.
Mỗi tội chỗ swap thì nên cho thêm if(min!=Arr[i]) thì mới swap.

rogp10 viết 15:45 ngày 01/10/2018

min có nằm trong mảng đâu bạn, vậy mới sai.

có link chi tiết không ban?

Bất biến là khái niệm trong c/m thuật toán (algorithm correctness) bài này là:

  • Mảng lúc nào cũng phải là hoán vị của mảng ban đầu. (chung cho các thuật toán sắp xếp)
  • a[i] là phần tử nhỏ thứ i dưới thứ tự <= cho trước. Ta nhớ rằng hoán vị không giảm là hoán vị mà thành phần thứ i cũng nhỏ thứ i.

Bất biến là mệnh đề ứng với chương trình, khác với điều kiện lặp. Bất biến phải luôn đúng, điều kiện lặp thì

Black viết 15:49 ngày 01/10/2018

Anh nói em mới ngộ ra. Đúng là sai thật.

Bài liên quan
0