几大排序算法(持续补充)

news/2024/11/8 21:04:49 标签: 排序算法, 算法, c++

算法>排序算法系列目录

文章目录

  • 算法>排序算法系列目录
  • 1.插入排序
  • 2.希尔排序
  • 3:直接选择排序
  • 3:堆排序
    • 3.1 堆的定义:
    • 3.2 堆排序的流程

1.插入排序

它的基本思想是:从第二个元素开始,每个元素都往前找合适的位置插入,直到所有的记录插入完为止,就能得到一个有序序列。 二个元素开始往前丢
自定义的说法:
1.满足排序指:
当升序时,a[j]<a[j+k],即a[j]<tmp
当降序时,a[j]>a[j+k],即a[j]>tmp
2.有效数组:指插入数字tmp前面的所有数据构成的数组
3.当有效数组中元素和tmp相比,当不满足排序时:就向后挪动数据,并且数组下标j–;
直到找到满足排序的下标(主动break出循环,记录下标)。但是如果遍历完整个有效数组后,都不满足排序,此时j=-1(会自动出循环时的下标,记录下标);
总结就是:不满足排序,挪动数据 满足排序记录下标,在循环外面 插入数据
4.时间复杂度为:O(n^2)
5.先选择要插入的数据:范围是[1,n)
选取插入数据tmp后,然后让要插入的数据tmp,与前面的有效数组依次进行比较。

在这里插入图片描述
代码:

#include <stdio.h>
void InsertSort(int* a, int n)
{
    for(int i =1;i<n;i++)
    {
        int tmp = a[i];
        int j;
        >>>>>//>>>>>>>>
        for(j=i-1;j>=0;j--)
        {
            if(a[j]>tmp)//当二个数据相等时,不能移动数据,否则插入排序不稳定。
            {
                a[j+1]=a[j];
            }
            else
            {
                break;       
            }  
			>>>>>>>>>>>>优化代码>>>>>>>>>>>>>
/*			for(j=i-1;j>=0 && a[j]>tmp;j--)
			{
					a[j+1] = a[j];
			} */
			>>>>>>>>>>>>>>>>>>>>>>>>>>>          
        }
        a[j + 1] = tmp;
    }
}
int main()
{
    int a[10]={5,61,2,3,8,0,6,7,8};
    InsertSort(a,10);
    for(int j=0;j<10;j++)
    {
        printf("%d  ",a[j]);
    }
}

2.希尔排序

是直接排序的优化:
gap=3 先分组然后再对每组进行插入排序
逻辑思路:
在这里插入图片描述

要插入的数据从下标从gap开始,到小于n,即 [gap,n)
当插入数据tmp=arr[x]时,有效数组下标为[0,x-gap]

void ShellSort(int *a ,int n)
{
    int gap = n;
    while(gap>1)
    {
        gap = gap / 3 + 1;
        for(int i = gap;i<n;i++)
        {
            //先拿下标为gap数据插入到前面的数据中
            //gap+1
            int tmp= a[i];
            int j;
            for (j = i - gap; j >= 0; j-=gap)
            {
                if(a[j]>tmp)
                {
                    a[j+gap] = a[j];
                }
                else
                {
                    break;
                }
            }
            a[j+gap] = tmp;
        }
    }
}
int main()
{
    int a[9]={1,3,6,2,0,7,4,9,3};
    int size = sizeof(a) / sizeof(a[0]);
    ShellSort(a, size);
    for (int j = 0; j < size; j++)
    {
        printf("%d  ",a[j]);
    }
}

代码逻辑:把间隔为gap的多组同时排序,而不是一组一组的排序
在这里插入图片描述
时间复杂度:O(log3NN)
gap=n
gap = gap/3+1 ;则N/3/3/3/3…=1 每进行一次分组,n/3,
分了log3N 次 3为底。分组后的插入排序为近似0(n),整体则为时间复杂度为O(log3N
N)。

3:直接选择排序

基本思想是:
1.第一遍选出最小的数放在第一个位置
2.第二遍选出最小的数放在第二个位置

在这里插入图片描述

void SelectSort(int *a, int n) {
    for (int begin = 0; begin < n - 1; begin++) 
    {
        int minIndex = begin;
        for (int i = begin + 1; i < n; i++) 
        {
            if (a[minIndex] > a[i]) 
            {
                minIndex = i;
            }
        }
        swap(&a[begin],&a[minIndex]);
    }
}

3:堆排序

直接选择排序的优化

3.1 堆的定义:

1.结构上是用数组表示的完全二叉树
2.有序性:满足大堆或者小堆的要求
大堆定义:树中所有父亲都要大于等于孩子
小堆定义:树中所有父亲都要小于等于孩子
在这里插入图片描述
堆结构在下标上:父子在下标上的关系
leftchild = parent *2 +1
rightchild = parent *2 +1
parent = (child-1)/2

3.2 堆排序的流程

升序:
1.采用向下调整算法,将数组变成一个大堆(根为最大值)。
2.将大堆的第一个数(最大值)和最后一个数交互,将最大值放在最后一个位置。
3.此时左子树和右子树都是大堆,采用向下调整算法,选出次大的。
在这里插入图片描述

void AdjustDwon(int *a , int n , int root)
{
	int parent = root;
	int child = parent *2 + 1;
	while(child <n)
	{
		if
	}
}

http://www.niftyadmin.cn/n/5744428.html

相关文章

SAP-MM-订单汇总单与采购订单对应关系接口

接口开发功能说明 业务背景将开发的接口的整体业务背景进行概要说明,可以用图进行描。 为准确承接采购辅助系统中订单汇总单与采购订单匹配关系,供财务辅助系统调用,采购辅助系统需要将订单汇总单及其对应的采购订单信息传递给SAP ERP,SAP ERP通过增强开发自定义表,承接此匹…

Pattern program MPAT 详解

本文为VIP文章,主要介绍Pattern中元素与格式、常用指令、地址&数据产生指令等。 目录 一、pattern概述 二:Pattern构成元素 1、pattern构成元素:MPAT、END 2、pattern构成元素:pattern file name 3、pattern构成元素:SDEF 4、Pattern构成元素:REGISETR 5、Pa…

Sophos | 网络安全

在 SophosLabs 和 SophosAI 的威胁情报、人工智能和机器学习的支持下&#xff0c;Sophos 提供广泛的高级产品和服务组合&#xff0c;以保护用户、网络和端点免受勒索软件、恶意软件、漏洞利用、网络钓鱼和各种其他网络攻击。Sophos 提供单一的集成式基于云的管理控制台 Sophos …

关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧

文章目录 1. sizeof 和 strlen1.1 sizeof1.2 strlen 2. 数组和指针结合的试题深入解析2.1 一维数组2.2 字符数组代码1代码2代码3代码4代码5代码6 2.3 二维数组 3.指针运算的试题深入解析题1题2题3题4题5题6题7 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力…

CDA Level I思维导图

ATTN:学习过程中采用官方书籍&#xff1a;《精益数据分析》 目录 一、绪论 二、表格结构data&表结构data 三、DB应用 四、描述性统计分析(统计学) 4.1statistics概论 4.2data的描述性统计 &#xff08;一&#xff09;集中趋势 &#xff08;二&#xff09;离散程度…

C转C++学习笔记--基础知识摘录总结

一、类型转换 静态转换&#xff08;Static Cast&#xff09; 静态转换是将一种数据类型的值强制转换为另一种数据类型的值。 静态转换通常用于比较类型相似的对象之间的转换&#xff0c;例如将 int 类型转换为 float 类型。 静态转换不进行任何运行时类型检查&#xff0c;因此…

JavaScript定时器详解:setTimeout与setInterval的使用与注意事项

在JavaScript中&#xff0c;定时器用于在指定的时间间隔后或周期性地执行代码。JavaScript 提供了两种主要的定时器函数&#xff1a;setTimeout 和 setInterval。以下是它们的详细解释和实现方式&#xff1a; 1. setTimeout setTimeout 函数用于在指定的毫秒数后执行一次函数…

YoloV10改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码

论文介绍 CARAFE模块概述:本文介绍了一种名为CARAFE(Content-Aware ReAssembly of FEatures)的模块,它是一种用于特征上采样的新方法。应用场景:CARAFE模块旨在改进图像处理和计算机视觉任务中的上采样过程,特别适用于目标检测、实例分割、语义分割和图像修复等任务。目标…