因此,我最近更新了我的Bubblesort(按字母顺序排序)以使用链接列表。
尽管现在我以前使用的反向方法打破了列表。 (如果我不先对单个列表气泡进行排序,以前可以使用)
气泡排序和交换。
void bubbleSort() {
City *temp = NULL;
City *current = head;
while (current != NULL) { //for the rest in list
if (current->getName().compare(current->next->getName()) > 0) { //compare distance
if (current == head) {
head = current->next;
}
swap(current, current->next);
}
current = current->next;
}
}
交换
void swap(City* i, City* j) {
if (i->previous) i->previous->next = j;
if (j->previous) j->previous->next = i;
if (i->next) i->next->previous = j;
if (j->next) j->next->previous = i;
City* temp;
temp = i->previous;
i->previous = j->previous;
j->previous = temp;
temp = i->next;
i->next = j->next;
j->next = temp;
}
这是现在损坏的反向列表。
void reverseList() {
City *temp = NULL;
City *current = head;
while (current != NULL) {
temp = current->previous;
current->previous = current->next;
current->next = temp;
current = current->previous;
}
if (temp != NULL) {
head = temp->previous;
}
}
问题我在打破列表的气泡排序中错过了什么?
最佳答案
一个错误是您的冒泡排序实现。由于冒泡排序具有O(n*n)
的复杂性,因此应该对数据进行多次遍历,其中n
是要排序的项目数。
换句话说,您需要在while
中执行bubbleSort
循环,直到您检测到数据已排序为止。这可以通过使用仅在出现swap
时设置的 bool(boolean) 标志然后测试该标志来完成,或者仅使n
传递数据。