各主流排序算法详细介绍

Posted csuchenzc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各主流排序算法详细介绍相关的知识,希望对你有一定的参考价值。

一,插入排序

插入排序基本思想:

  在一个已经有序的序列里插入新的元素,直到有序序列包含所有被排序元素。

例子:

   技术图片

代码实现:

技术图片
void InsertSort(vector<int> &v)
{
    for(int i = 1;i < v.size(); ++i)//i表示有序集合里的元素数目和待插入元素下标
    {
        for(int j = i; j > 0 && v[j-1] > v[j]; --j)
        {
            int temp = v[j-1];
            v[j-1] = v[j];
            v[j] = temp;
        }
    }
}
View Code

时间复杂度为O(N^2)

空间复杂度为O(1)

插入排序在小规模数据时或者基本有序时比较高效。

二,希尔排序

希尔排序基本思想:

  希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。本质上是分组插入排序。

例子:

   技术图片

 

 在取增量d的时候一般有以下要求:

①最后一次排序d = 1;

②每次取的d并不包含处1以外的公因子;

③采用缩小增量法,d的取值逐步缩小。

代码实现:

技术图片
void ShellSort(vector<int> &v)
{
    int k = 0;
    int t = v.size() - 1;
    int delta = 2*t - k - 1;//有研究表明,delta取2*t-k-1时时间复杂度可达O(N^1.5) 
    for(k = 0;k < v.size(); ++k)
    {
        delta = (2*t-k-1) == t?(2*t-k-1):1;//最后一次delta要取1
        for(int i = 0; i < v.size()-delta; ++i)
        {
            if(v[i] > v[i+delta])
            {
                int temp = v[i];
                v[i] = v[i+delta];
                v[i+delta] = temp;
            }
        }
    }
}
View Code

希尔排序delta开始会很大,所以该排序不稳定。

希尔排序的复杂度与delta相关:

{1,2,4,8,...}使用这个增量序列的时间复杂度(最坏情形)是O(N^2)

代码中所给序列的时间复杂度时O(N^1.5)

空间复杂度为O(1)

希尔排序为插入排序的一种优化,其适用范围为:大规模且无序的数据。

 

未完待续!

以上是关于各主流排序算法详细介绍的主要内容,如果未能解决你的问题,请参考以下文章

排序算法:Bucket Sort 桶排序

数据结构与算法 排序算法 附有详细动画流程分析图

算法总结:这是一份全面&详细的排序算法学习指南

算法总结:这是一份全面&详细的排序算法学习指南

算法总结:这是一份全面&详细的排序算法学习指南

算法排序之堆排序