Reference Book: 《Data Structures and Program Design in C++》
---------------------------------------------------------------------------------------------------------------------------------------------------
1. Doubly_Linked_List
见文章《Doubly_Linked_List的代码实现》
2. Sortable_list
#ifndef SORTABLE_LIST_H
#define SORTABLE_LIST_H
#include "Doubly_Linked_List.h"
#include "Record.h"
#define MAX_SIZE 128
template <class Key>
class Sortable_list: public Doubly_Linked_List<Key>
{
public:
//直接调用基类Doubly_Linked_List的初始化方法
// 插入排序
void insertion_sort();
// 选择排序
void selection_sort();
int max_key(int low, int high);
void swap(int low, int high);
// 希尔排序(不适用链式实现)
void sort_interval(int start, int increment);
void shell_sort();
// 归并排序
void merge_sort();
void recursive_merge_sort(Sortable_list<Key> &the_list);
// 不用书中传入head指针的实现方式
Sortable_list<Key> divide_from(Sortable_list<Key> &the_list);
void combine(Sortable_list<Key> &the_list,
const Sortable_list<Key> &second_list);
// 快速排序
void quick_sort();
void recursive_quick_sort(Sortable_list<Key> &the_list);
Sortable_list<Key> partition(Sortable_list<Key> &the_list,
Key pivot);
void unite(Sortable_list<Key> &the_list,
Sortable_list<Key> &second_list,
Key pivot);
// 堆排序
void heap_sort();
void build_heap();
void insert_heap(const Key &now, int low, int high);
void insert_array(int position, const Key &data);
void traverse_array(void (*visit)(Key &));
protected:
private:
Key entry[MAX_SIZE];
};
/*************************************
* Insertion Sort *
*************************************/
template <class Key>
void Sortable_list<Key>::insertion_sort()
/*Pre:
Post: 从前向后遍历表, 将尚未排序的第一个键在已排序队列中找到合适的位置进行插入.
*/
{
Node<Key> *first_unsorted, *last_sorted, *now, *trailing;
if(Doubly_Linked_List<Key>::head != nullptr) // head是双链表类中的元素, 需要作用域符号
{
last_sorted = Doubly_Linked_List<Key>::head;
while(last_sorted->next != nullptr)
{
first_unsorted = last_sorted->next;
// 插入到pos==0的位置
if(first_unsorted->entry <= Doubly_Linked_List<Key>::head->entry)
{
last_sorted->next = first_unsorted->next;
if(first_unsorted->next != nullptr) // 当unsorted中至少有1个结点时
first_unsorted->next->back = last_sorted;
Doubly_Linked_List<Key>::head->back = first_unsorted;
first_unsorted->next = Doubly_Linked_List<Key>::head;
first_unsorted->back = nullptr;
Doubly_Linked_List<Key>::head = first_unsorted;
}
// 搜索正确的pos插入