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

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

简单排序

概述

排序函数一般的命名:

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个逆序对

目录
相关文章
|
5月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
2月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
163 7
|
2月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
134 8
|
3月前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
59 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
3月前
|
搜索推荐 Shell
解析排序算法:十大排序方法的工作原理与性能比较
解析排序算法:十大排序方法的工作原理与性能比较
105 9
|
3月前
|
算法 搜索推荐 Java
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
基数排序是一种稳定的排序算法,通过将数字按位数切割并分配到不同的桶中,以空间换时间的方式实现快速排序,但占用内存较大,不适合含有负数的数组。
48 0
数据结构与算法学习十三:基数排序,以空间换时间的稳定式排序,速度很快。
|
3月前
|
算法 搜索推荐
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
本文介绍了冒泡排序、选择排序和插入排序三种基础排序算法的原理、实现代码和测试结果。
28 0
数据结构与算法学习十一:冒泡排序、选择排序、插入排序
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
38 0
|
3月前
|
搜索推荐 算法
【排序算法(一)】——插入排序,选择排序 —> 深层解析
【排序算法(一)】——插入排序,选择排序 —> 深层解析
|
3月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
87 0