码迷,mamicode.com
首页 > 编程语言 > 详细

各主流排序算法详细介绍

时间:2020-05-23 00:42:58      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:one   close   cli   sed   show   view   image   display   排序算法   

一,插入排序

插入排序基本思想:

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

例子:

   技术图片

代码实现:

技术图片
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)

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

 

未完待续!

各主流排序算法详细介绍

标签:one   close   cli   sed   show   view   image   display   排序算法   

原文地址:https://www.cnblogs.com/csuchenzc/p/12940416.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!