Heya我正在尝试在单链表上实现选择排序算法,我知道代码中存在一些问题但是虽然我的链表包含数字7 1 2 6,但运行后的输出是7777。任何帮助将不胜感激。
template<class Type>
void UnOrderedLinkedList<Type>::selectionSort()
{
nodeType<Type>* loc;
nodeType<Type>* minIndex;
nodeType<Type>* temp;
temp = first;
if(temp == NULL)
cerr<<"Cannot sort an empty list."<<endl;
else
if(temp->link == NULL)
cerr<<"List has only one item so it is already sorted."<<endl;
else
while(temp != NULL)
{
minIndex = minLocation(temp, last);
swap(temp, minIndex);
temp = temp->link;
}
}
template<class Type>
nodeType<Type>* UnOrderedLinkedList<Type>::minLocation(nodeType<Type>* first, nodeType<Type>* last)
nodeType<Type>* minIndex;
nodeType<Type>* other;
minIndex = first;
other = minIndex->link;
while(other != NULL)
{
if(minIndex->info > other->info)
{
minIndex = other;
other = other->link;
}
else
{
other = other->link;
}
}
return minIndex;
}
然后交换:
template<class Type>
void UnOrderedLinkedList<Type>::swap(nodeType<Type>* first, nodeType<Type>* second)
{
nodeType<Type>* temp;
temp->info = first->info;
first->info = second->info;
second->info = temp->info;
}
答案 0 :(得分:2)
来自swap
功能:
nodeType<Type>* temp;
temp->info = first->info;
这是未定义行为的明显案例!你声明一个局部变量,一个指针,没有初始化。然后你直接使用未初始化的变量,导致所述UB。由于你使用指针,你应该对程序没有崩溃感到高兴。
这里您不需要指针或节点,因为您实际上没有交换节点。您所需要的只是info
的实例,并使用它:
SomeType temp;
temp = first->info;
first->info = second->info;
second->info = temp;
答案 1 :(得分:1)
@JoachimPileborg的答案当然有效,但请注意,您不需要编写自己的单链表的成员函数sort
来进行选择排序。
原因是selection_sort
O(N^2)
(std::forward_list
复杂度)已经与任何暴露前向迭代器的单链表兼容,例如一个来自标准库,#include <algorithm> // min_element, iter_swap, is_sorted
#include <cassert> // assert
#include <forward_list> // forward_list
#include <functional> // less
#include <iostream> // cout
#include <ios> // boolalpha
#include <iterator> // distance, next
template<class FwdIt, class Compare = std::less<>>
void selection_sort(FwdIt first, FwdIt last, Compare cmp = Compare{})
{
for (auto it = first; it != last; ++it) {
auto const selection = std::min_element(it, last, cmp);
std::iter_swap(selection, it);
assert(std::is_sorted(first, std::next(it), cmp));
}
}
int main()
{
auto fl = std::forward_list<int> { 2, 4, 1, 0, -1, 8, 2 };
std::cout << std::boolalpha << std::is_sorted(fl.begin(), fl.end()) << '\n';
for (auto const& e : fl) std::cout << e << ", "; std::cout << '\n';
selection_sort(fl.begin(), fl.end());
std::cout << std::boolalpha << std::is_sorted(fl.begin(), fl.end()) << '\n';
for (auto const& e : fl) std::cout << e << ", "; std::cout << '\n';
}
:
std::forward_list
请注意sort
也实现了自己的成员函数O(N log N)
。这个版本 - 它进行O(N)
合并排序 - 无法单独基于公共接口实现(实际上你可以使用O(1)
额外存储而不是forward_list
存储SELECT p.products_id, ANY_VALUE(pc.partner_channel), ANY_VALUE(pc.active_status)
FROM products p
LEFT JOIN products_catalog pc ON pc.products_id=p.products_id
GROUP BY p.products_id
having sum(pc.active_status)=0
ORDER BY p.products_id;
存储1}}保证)。