数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)

简介: 数据结构与算法——简单排序-冒泡排序、插入排序,时间复杂度下界(图示、代码、时间复杂度、定理)

简单排序

概述

排序函数一般的命名:

void X_Sort(ElementType A[], int N)

X为具体的排序名称,例如:冒泡、插入、希尔等等;


A[ ] 为要排序的主体;N为要排序的数据个数。 (N是正整数)


  • 大多数情况下,为简单起见,讨论从小到大的整数排序
  • 只讨论基于比较的排序(即 >  =  < 有定义)
  • 只讨论内部排序(即数据全部存在于内存内,没有内存外部的数据需要排序,相对应的为外部排序)
  • 稳定性:任意两个相等的数据,排序前后的相对位置不发生改变
  • 没有一种排序是任何情况下都表现最好的

冒泡排序

图示

 

代码 (C语言)

void Bubble_Sort(ElementType A[], int N)
{
    for(P = N -1; P >= 0; P--)
    {
        flag = 0;   //用于判断排序是否需要继续
        for(i = 0; i < P; i ++)  //一趟冒泡
        {
            if(A[i] > A[i+1])
            {
                Swap(A[i],A[i+1]);
                flag = 1;        
            }
        }
        if(flag = 0) break;  //如果全部扫描之后没有元素进行交换,则说明不需要再进行排序了,所以直接退出
    }  
}

时间复杂度

最好情况:顺序

最坏情况:逆序

插入排序

图示

 

代码(C语言)

void InsertionSort( ElementType A[], int N )
{ /* 插入排序 */
     int P, i;
     ElementType Tmp;
     
     for ( P=1; P<N; P++ ) {
         Tmp = A[P]; /* 取出未排序序列中的第一个元素*/
         for ( i=P; i>0 && A[i-1]>Tmp; i-- )
             A[i] = A[i-1]; /*依次与已排序序列中元素比较并右移*/
         A[i] = Tmp; /* 放进合适的位置 */
     }
}

时间复杂度

最好情况:顺序

最坏情况:逆序

问:给定初始序列{ 34,8,64,51,32,21 },冒泡排序和插入排序分别需要多少次元素交换才能完成?

把心中的答案记下来,我们先往下看:

时间复杂度下界

  • 对于下标i < j,如果A[ i ] > A[ j ],则称(i,j)是一对逆序对(inversion)
  • 序列{ 34,8,64,51,32,21 }中总共有九对逆序对

分别为:(34,8)(34,32)(34,21)(64,51)(64,32)(64,21)(51,32)(51,21)(32,21)


交换2个相邻元素正好消去1个逆序对

故而上面那道题目的答案是9,冒泡排序和插入排序的交换元素次数都为9次;因为序列中有9对逆序对,两个简单排序都是以交换相邻元素为主的,所以次数一致。


而如果冒泡和插入排序的元素个数为N,逆序对的个数为I,那么时间复杂度就为

如果序列基本有序,则冒泡、插入排序简单且高效。

定理

  1. 任意N个不同元素组成的序列平均具有N(N-1)/4个逆序对
  2. 任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为

指的是下界)

这一意味着:要提高算法效率,我们必须:

  • 每次要消去不止1个逆序对!
  • 每次交换相隔较远的2个元素!

交换相隔较远的2个元素就有可能一次性消去不止1个逆序对

目录
相关文章
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
737 1
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
747 1
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
272 1
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
431 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
704 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
存储 算法 索引
HashMap底层数据结构及其增put删remove查get方法的代码实现原理
HashMap 是基于数组 + 链表 + 红黑树实现的高效键值对存储结构。默认初始容量为16,负载因子为0.75。当存储元素超过容量 * 负载因子时,会进行扩容。HashMap 使用哈希算法计算键的索引位置,通过链表或红黑树解决哈希冲突,确保高效存取。插入、获取和删除操作的时间复杂度接近 O(1)。
467 0
05(数据结构考研)树相关操作代码
05(数据结构考研)树相关操作代码
144 0
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
1438 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
1025 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
机器学习/深度学习 存储 算法
【数据结构与算法基础】——算法复杂度
【数据结构与算法基础】——算法复杂度

热门文章

最新文章