Tôi giả định rằng chức năng qsort cũ tốt trong stdlib không ổn định, bởi vì trang người đàn ông không nói gì về nó. Đây là hàm tôi đang nói về:Ổn định qsort thư viện chuẩn?
#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
Tôi giả sử rằng nếu tôi thay đổi hàm so sánh cũng bao gồm địa chỉ mà tôi so sánh, nó sẽ ổn định. Đúng không?
Ví dụ:
int compareFoos(const void* pA, const void *pB) {
Foo *pFooA = (Foo*) pA;
Foo *pFooB = (Foo*) pB;
if(pFooA->id < pFooB->id) {
return -1;
} else if(pFooA->id > pFooB->id) {
return 1;
} else if(pA < pB) {
return -1;
} else if(pB > pA) {
return 1;
} else {
return 0;
}
}
Tôi không hiểu tại sao bạn lại so sánh các con trỏ. Và những gì bạn có nghĩa là ổn định (tha thứ cho sự thiếu hiểu biết của tôi). Có lẽ bạn có thể xây dựng trong câu hỏi của bạn. – jmatthias
Bởi ổn định ông có nghĩa là đó là một mặt hàng so sánh bằng mục b, và một ban đầu đến trước b trong mảng, nó sẽ * vẫn * đến trước b trong mảng được sắp xếp. Thuật ngữ nghệ thuật trong phân loại vòng kết nối và lý do cho việc hack so sánh địa chỉ. Rât gọn gang. – dmckee
Ý tưởng rất gọn gàng, @dmckee, nhưng tiếc là không ổn định vì twk đang sử dụng địa chỉ hiện tại thay vì bắt đầu địa chỉ :-) – paxdiablo