美文网首页
三大排序算法

三大排序算法

作者: Jarily | 来源:发表于2018-05-29 20:25 被阅读0次

归并排序[稳定的排序算法]

递归实现

void Merge (vector<int > & seq, int low, int mid, int high)
{
    vector<int > tmp;
    int i = low, j = mid + 1;
    while (i <= mid && j <= high)
    {
        if (seq[i] <= seq[j])
            tmp.push_back (seq[i++]);
        else
            tmp.push_back (seq[j++]);
    }

    while (i <= mid)
        tmp.push_back (seq[i++]);

    while (j <= high)
        tmp.push_back (seq[j++]);

    for (i = 0; i < tmp.size(); i++)
        seq[low + i] = tmp[i];
}

void  mergeSort (vector<int > & seq, int low, int high)
{
    if (low < high)
    {
        int mid = (low + high) >> 1;
        mergeSort (seq, low, mid);
        mergeSort (seq, mid + 1, high);
        Merge (seq, low, mid, high);
    }
}

非递归实现

void Merge (vector<int > & seq, int start1, int start2, int seg)
{
    vector<int > tmp;
    int i = start1, j = start2;
    int n = seq.size();

    while (i < start1 + seg && j < start2 + seg && i < n && j < n)
    {
        if (seq[i] <= seq[j])
            tmp.push_back (seq[i++]);
        else
            tmp.push_back (seq[j++]);
    }

    while (i < start1 + seg && i < n)
        tmp.push_back (seq[i++]);

    while (j < start2 + seg && j < n)
        tmp.push_back (seq[j++]);

    int k = tmp.size();
    for (i = start1; i < start1 + k; i++)
        seq[i] = tmp[i - start1];
}

void  mergeSort (vector<int > & seq)
{
    int n = seq.size();
    for (int seg = 1; seg < n; seg *= 2)
    {
        for (int i = 0; (i + 1)*seg < n; i += 2)
        {
            Merge (seq, i * seg, (i + 1) * seg, seg);
        }
    }
}

快速排序[不稳定的排序算法]

int Partition (vector<int > & seq, int low, int high)//填坑法
{
    vector<int > tmp;
    int i = low, j = high;
    int key = seq[low];//哨兵选取最左边元素
    while (i < j)
    {
        while (seq[j] >= key && i < j)//从右往左寻找
            j--;
        if (i < j)
            seq[i++] = seq[j];//第一次:第一个小于key的值赋给了low位置,即原来哨兵位置
        while (seq[i] < key && i < j)//从左往右寻找
            i++;
        if (i < j)
            seq[j--] = seq[i];
    }
    seq[i] = key;//保存最后的哨兵位置,i==j的地方左边小于key,右边大于等于key
    return i;
}

void  quickSort (vector<int > & seq, int low, int high)
{
    if (low < high)
    {
        int pos = Partition (seq, low, high);
        quickSort (seq, low, pos - 1);
        quickSort (seq, pos + 1, high);
    }
}

堆排序[不稳定的排序算法]

void Adjust (vector<int > & seq, int n, int cur) //最大堆调整
{
    int lc = cur * 2 + 1;//左儿子
    int rc = lc + 1;//右儿子
    if (lc < n && seq[cur] < seq[lc])
    {
        swap (seq[cur], seq[lc]);
        Adjust (seq, n, lc);
    }

    if (rc < n && seq[cur] < seq[rc])
    {
        swap (seq[cur], seq[rc]);
        Adjust (seq, n, rc);
    }
}

void AdjustMaxHeap (vector<int > & seq, int n)
{
    int i = (n - 2) / 2;//从第一个非叶子结点开始
    while (i >= 0)
    {
        Adjust (seq, n, i);
        i--;
    }
}

//s升序排序:先建立一个最大堆,然后将堆顶元素和最后一个元素交换,继续调整,调整完即排好序
void  heapSort (vector<int > & seq)
{
    int n = seq.size();
    AdjustMaxHeap (seq, n);
    for (int i = n - 1; i >= 0; i--)
    {
        swap (seq[0], seq[i]);
        Adjust (seq, i, 0);
    }
}

相关文章

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 算法学习(1)-排序算法

    八大排序算法九大排序算法再总结[经典排序算法][集锦][直观学习排序算法] 视觉直观感受若干常用排序算法 快速排序...

  • 经典排序算法总结

    经典排序算法集锦 冒泡法 排序算法入门之冒泡排序 排序算法入门之冒泡排序优化

  • 前端算法学习-第一篇

    冒泡排序算法 冒泡排序算法是最慢的排序算法之一,也是最容易实现的排序算法。之所以叫冒泡排序是因为使用这种算法排序时...

  • 七大排序算法之冒泡排序

    七大排序算法之冒泡排序 @(算法笔记)[排序算法, 冒泡排序, C++实现] 冒泡排序介绍 冒泡排序是七大排序算法...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 浅谈排序算法

    排序算法有很多种,今天先谈谈一些简单的排序算法。包括桶排序、冒泡排序和快速排序算法。后期总结各种排序算法。 桶排序...

  • 线性排序

    桶排序、计数排序、基数排序 一、线性排序算法介绍 1.线性排序算法包括桶排序、计数排序、基数排序。2.线性排序算法...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

网友评论

      本文标题:三大排序算法

      本文链接:https://www.haomeiwen.com/subject/zetzjftx.html