数据结构——六种Sort方法的代码实现

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插入
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值