内部排序

【排序算法】内部排序算法总结 直接插入排序 折半插入排序 希尔排序 起泡排序 快速排序 归并排序 堆排序 下面的排序算法代码都是基于数组实现的。 1:直接插入排序(Straight Insertion Sort) 直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。 一般情况下,第 i 趟直接插入排序的操作为:在含有 i-1 ... 阅读详情

排序算法的分类:
根据文件记录的存放位置:

  • 内部排序:排序过程中将全部记录放在内存中处理
  • 外部排序:排序过程中需在内外存之间交换信息

内部排序算法梳理

①插入排序:
直接插入排序(基于顺序查找)
折半插入排序(基于折半查找)
表插入排序(基于链表存储)
希尔排序(基于逐趟缩小增量)
②交换排序:
冒泡排序
快速排序
③选择排序:
简单选择排序
树形选择排序(锦标赛排序)
堆排序
④归并排序:
两路归并排序
⑤基数排序(分配排序):
基数排序


各种内部排序方法的比较

排序算法比较

数据存储结构

约定:顺序存储,关键字类型为int型
有两种方式:
1. 数组存数据(这是我的代码版本)
2. 用到结构体(课件ppt上的版本)

#define MaxSize 20
typedef int KeyType
typedef struct
{
    KeyType key;//存储关键字
    InfoType otherinfo;//其余信息
}RedType;

typedef struct 
{
    RedType a[MaxSize+1];//a[0]闲置或作哨兵
    int length;//关键字数目
}SqList;

各排序算法详解

main函数中初始化数组以及swap函数定义

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 12
void swap(int &a, int &b);
void Insert(int a[], int n);

int main()
{
    int array[MAXSIZE+1];//从下标1开始存
    int i;
    printf("Please input %d numbers.\n", MAXSIZE);
    for (i = 1; i < MAXSIZE + 1; i++)//读入MaxSize个关键字
    {
        scanf_s("%d", &array[i]);
    }
    printf("Input successfully!\n");
    Insert(array, MAXSIZE);//根据不同排序算法调用的函数有所不同
    printf("The result is:\n");//排好序了,下面打印
    for (i = 1; i < MAXSIZE + 1; i++)
    {
        printf("%d ", array[i]);
    }
    system("pause");
    return 0;

}

void swap(int &a, int &b)//swap函数定义
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

1.插入排序

  • 直接插入排序

思路:
一次比到底,从第二个关键字开始,直到最后一个关键字,首先每个关键字与它前面的关键字比,看是否满足升序或降序,若不满足则swap且j往前挪一个,直到比较到第一个或者满足升序或降序。
需注意的是,插入排序就是一个个跟前面的比较,而其前面的序列已经排好队了。
和冒泡排序的差别是,直接插入一次比到底。

代码实现

void Direct_Insert(int a[], int n)//传入数组首地址(即数组名)和关键字个数即MaxSize
{
    int i,j;//存储下标的变量
    for(i=2;i<=n;i++)//i控制的是下标
    {
         j=i;
         while(j>1&&a[j]<a[j-1])//如果不是升序 则swap
         {
             swap(a[j],a[j-1]);
             j--;
         }
    }
}
  • 折半插入排序
    即把直接插入排序的顺序查找操作改为折半查找,以减少关键字比较次数,效率更高。

  • 2-路插入排序

  • 希尔排序
    由于直接插入排序在待排序列基本有序和待排记录数量少时,效率高,故希尔排序就是从宏观上将待排序列调整到基本有序,再使用直接插入排序将其全部排序。

而希尔排序的思路是,采用增量递减的方法,先设一个增量d,然后按增量d进行分组,每组之中采用直接插入排序,排完后减小增量d, 比如将其调整为原来的1/2,再在每组中采用直接插入排序,直到增量d为1,即只有一组,且所有关键词都在这一组中,进行最后的直接插入排序。(增量d的设定是关键)

交换排序

  • 冒泡排序

算法思路:从第一位开始,临近的数两两比较,按照升序或降序进行交换,这样一趟过去后,最大或最小的数被放到最后一位,然后再从头开始两两比较,直到倒数第二位时结束,以此类推。

Notes: 冒泡排序和直接插入排序的不同:
直接插入排序是确定待插入的数之前的序列是已经排好的,只需一个个和前面的比,找到合适的位置,插入;而冒泡排序是从头开始向后两两比较,和他比较的是否满足升序或降序的条件,它都要比到最后一个,根据它是第几趟排序来判断,至多进行n-1趟

代码实现:

#define TRUE 1
#define FALSE 0
void BubbleSort(int a[],int n)
{
    int Sorted;
    int i,j;
    for(i=0;i<n-1&&(!Sorted);i++)//因为下面要n-i故i从0开始,且至多进行n-1趟,故i<n-1
    {
        Sorted=TRUE;
        for(j=1;j<n-i;j++)//已排好的后面i个不用比较
        {
            if(a[j]>a[j+1])//如果不满足升序
            {
                swap(a[j],a[j+1]);
                Sorted=FALSE;
            }
        }
    }
}
//Sorted作用,我认为是,当外循环第i趟时,内部无操作,则后面第i+1直到n-1趟时,内部都无操作,也就是当内部无操作时,这时已经提前排好序了,循环可以跳出了。
  • 快速排序

选择排序

  • 简单选择排序

算法思路:
从第一个数开始,依次往后遍历到最后一个数,找到最大的数的下标,swap第一个数和最大的数;再从第二个数开始往后遍历,直到到了最后一个数。

代码实现

void Select_Sort(int a[], int n)
{
    int i, j, pos;//pos是当前要比较的元素下标
    for (i = 1; i <= MAXSIZE; i++)//找当前趟最大的数
    {
        pos = i;
        for (j = i+1; j <= MAXSIZE; j++)
        {
            if (a[j] > a[pos])
            {
                pos = j;

            }
        }//循环跳出后pos存储当前最大元素的下标
        swap(a[i], a[pos]);

    }
}
平面变压器PCB绕组设计实战:从原理到布局的工程考量 本文深入探讨了平面变压器PCB绕组设计的工程实践,从基础原理到布局优化,涵盖了电流密度、层间绝缘、绕组拓扑结构等关键参数。通过实战案例分享,解析了高频应用中的集肤效应、邻近效应等挑战,并提供了热管理和EMC优化的实用技巧,助力工程师在服务器电源、车载充电器等空间敏感场景实现高效设计。 阅读详情

相关推荐

STM32驱动数码管:从硬件连接到动态显示实现

本文详细介绍了使用STM32单片机驱动数码管的完整流程,从硬件连接到软件实现。内容涵盖共阳/共阴数码管原理、GPIO配置、段码表生成,并重点解析了多位数码管动态显示的核心技术,包括动态扫描原理、消影处理及实战代码,帮助开发者快速掌握这一嵌入式开发基础技能。

p5l2m9n4o6q的博客 574

几种常见的内部排序

排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。 排序分为内部排序和外部排序。 随着计算机的内存不断扩大和查找算法的不断优化,外部排序用到地方不多了。 设待排序的关键字序列为{12,2,16,30,28,10,16*,20,6,18} 1:直接插入排序:它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,

wust_cyl的博客 1万+

PCB阻焊工艺全解析:从油墨选择到显影测试的完整指南

本文深入解析PCB阻焊工艺全流程,从材料科学角度对比液态光成像(LPI)油墨、干膜阻焊等核心材料特性,系统阐述前处理、涂覆、预烤曝光、显影固化等关键步骤的工艺要点与参数控制。重点探讨了如何通过优化油墨选择与工艺参数,解决常见缺陷,提升PCB的可靠性、美观度及可制造性,为工程师提供从理论到产线实战的完整指南。

s3t4u的博客 551

八大内部排序

八大排序 前言 排序,就是重新排列表中的元素,使得表中元素满足按关键字有序的过程。 排序有许多种,常用的八大内部排序为冒泡排序、插入排序、选择排序、希尔排序、快速排序、归并排序、基数排序、堆排序 这几种排序没有绝对的优劣,每种排序都有他们适用范围 一、冒泡排序 冒泡排序每一趟排序可以确定一个元素的最终位置,若一次扫描并没有元素进行交换,则说明表已有序。 void bubbleSort(ElemType a[], int n){ for(int i = 0; i < n - 1;.

Stillsings的博客 2127

单细胞分析实战:用R语言绘制带连线的堆叠柱状图(附完整代码)

本文详细介绍了如何使用R语言绘制带连线的堆叠柱状图进行单细胞转录组数据分析,特别适用于展示细胞比例变化趋势。通过完整代码示例和实战技巧,帮助研究者优化多组别比较的可视化效果,提升科研图表质量。

yhn4567890的博客 390

基于three.js的室内全景3D展馆案例分享

3D场景展厅

acheng 3558

邓俊辉 数据结构 优先级队列

概述(需求和动机) 概述(基本实现)

dldldl1994的博客 610

睿尔曼超轻量仿人机械臂--PLC控制

PLC通过以太网与机械臂创建socket连接,PLC发送JSON协议控制机械臂进行物料抓取。

weixin_61488836的博客 2464

数据结构笔记(邓俊辉 学堂在线课程) 排序算法

数据结构 排序算法气泡排序归并排序选择排序插入排序 气泡排序 (向量) 遍历序列,当检测到序列中有相邻的不无序对则交换他们的位置 最坏的效率为O(n^2) 优化举措: (1)当在遍历时,如果后续的序列时有序的,应当规避掉无用的遍历,即在每次遍历时都应缓存下当前无序的最右侧元素的秩,用作下次遍历时使用 归并排序 (向量) 将无序的序列划分为左右两个子序列 最坏效率 为O(nlogn) 选择排序 (...

海王星很危险的博客 1175

社交媒体文章内容与评论抓取:Python 爬虫实战教程

通过本文的介绍,我们学习了如何使用 Python 编写爬虫,抓取社交媒体平台的文章内容和评论。我们详细介绍了如何使用requestsSelenium和Tweepy等工具,抓取微博和 Twitter 上的公开数据。同时,我们还讨论了如何处理反爬虫机制,避免账号或 IP 被封禁。抓取社交媒体数据是一个充满挑战和乐趣的过程,掌握这些技术后,你可以在大数据分析、情感分析和舆情监测等方面得到更深层次的应用。

2201_76125261的博客 1710

uniapp ios原生插件开发 (framework,cocoapods)

已知UniApp的插件开发方式有两种, 第一种 Xcode Framework的方式,这种方式是官方指定的方式。 这种方式的优点就是简单直接, 但也有不足,比如当插件需要引入一些三方库时,操作起来就不是那么方便。 而使用Cocoapods则可以很方便的引入三方库。 接下来,本文探索使用Cocoapods的方式来进行UniApp插件开发。

Rey的技术博客 9822

内部排序算法

参考: 八大排序算法 外部排序 三种线性排序算法 计数排序、桶排序与基数排序 浅谈排序算法实现 (计数排序、基数排序) 堆排序时间复杂度的理解 快速排序及优化排序分为内部排序与外部排序。 内部排序:数据比较少,直接在内存中进行排序 外部排序:大量数据排序,待排的数据保存在外存储器上(比如硬盘),带排序文件无法一次装入内存,需要在内存与硬盘之间进行多次数据交换,以达到排序整个文件的目的

每天进步一点 822

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

内部排序 (一):各种内部排序方法的比较

作为数据结构的课程笔记,以便查阅。如有出错的地方,还请多多指正! 目录各种内部排序方法的比较地址排序(基于关键字比较的)内部排序在最坏情况下的最快速度 各种内部排序方法的比较 nnn较小/基本有序:可采用简单排序方法(直接插入、简单选择、冒泡排序) nnn较大:可采用快排、堆排。若要求稳定性,则采用归并排序 从平均时间性能上看,快排最佳,但快排在最坏情况下的时间性能不如堆排和归并排序 nnn较大时,归并排序比堆排序用时少,但所需的辅助存储量多 基数排序适用于nnn很大,关键字个数较少的

连理o的博客 3486

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《内部排序算法比较》

《内部排序算法比较》 一、【问题描述】 在教科书中,各种内部排序算法的时间复杂度分析结果只给出算法的大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以获得直观感受 【基本要求】 (1) 对6种常用内部排序算法进行比较:冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序 (2) 待排序的表长不小于100,其中数据要用伪随机数产生,至少用5组不同的输入数据做比较 ...

mufen之内部排序算法比较 8847

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

内部排序与外部排序

转载自:https://blog.youkuaiyun.com/hq942845204/article/details/80303762 本篇文章主要介绍内部排序与外部排序的知识,如果你和我一样还不知道内部排序和外部排序为何物的话,不妨看看我的理解 正文 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两大类:内部排序与外部排序。 概念 内部排序:待排序记录存放在计算...

L_X_Y_HH的博客 1710

内部排序算法总结

内部排序算法总结 排序算法介绍 排序算法主要可以分为内部排序和外部排序,其中内部排序由可以分为非线性时间比较排序和线性时间非比较排序,前者主要通过比较来决定元素之间的相对次序,都有关键字的比较和记录的移动,其时间复杂度不能突破O(nlogn),后者不需要通过比较来进行,可以以线性时间运行。 排序算法分类 非线性时间比较排序: 插入排序:简单插入排序、折半插入排序、希尔...

点滴 1363

实验八 内部排序

实验八 内部排序 1.(必做题)在完善“12.11.4 参考源程序”的基础上,进行典型内部排序算法的比较。 (1) 随机产生整数样本,进行8种排序,并比较各种排序算法的执行时间,如执行时间均为0,可考虑增大样本,如加大至5000或10000。 (2) 设计方案,修改“12.11.4 参考源程序”,对8种排序算法的数据元素比较次数和移动次数进行比较。 (3) 修改“12.11.4 参考源程序”,输出...

小明同学的博客 2696

内部排序和外部排序小结

一、内部排序的比较: 1、从时间复杂度来看: 简单选择排序、直接插入排序和冒泡排序的平均复杂度都为 O(n2),并且实现过程也较为简单,但是直接插入排序和冒泡排序在最好的情况下时间复杂度可以达到 O(n),而简单选择排序则与序列的初始状态无关。 希尔排序作为插入排序的扩展,对较大规模的排序都可以达到很高的效率,但是目前未得出其精确的渐近时间。 堆排序是利用一种称为堆的数据结构,可以在线性时...

一个小白的成长之路 1万+

排序(一) - 内部排序

Internal Sorting 基本概念 排序:重新排列列表中元素,使表中元素满足按关键字有序的过程。 算法稳定性:待排序表中的两个对应关键字相同的元素Ri和Rj,使用某一排序算法之后,Ri和Rj的相对位置保持不变。 算法是否具有稳定性不是衡量算法优劣的标准,只是对算法性质的描述。 算法的分类 分类标准:排序期间数据元素是否全部存放在内存中 内部排序 - 排序期间元素全部存放在内存中 外部排序 - 排序期间元素无法在全部同时存放在内存中(必须在排序过程中根据要求不断在内、外存之间移动 一般,内

AuthurLEE's Blogs 2943

内部排序总结

通过一趟排序将待排序表划分为独立的两个部分L[1....k-1]和L[k+1...n],使得L[1....k-1]中所有元素小于pivot,使得L[k+1...n]中所有元素大于或等于pivot,则pivot放在最终的位置L(k)上,则完成一次划分。(4)在基于比较的排序算法中,每次比较两个关键字的大小之后,仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证正明:当文件的n个关键字随机分布时,任何借助于“比较”的排序算法,至少需要0(nlog2n)的时间。

qikuhu的博客 800

数据结构-内部排序

全网最详!深圳大学数据结构内部排序总结 八大排序算法硬核详解

m0_74175922的博客 1566

24、各种内部排序的比较

一、复杂度对比 前面我们学习了各种内部排序的方法,我们现在关于复杂度作一对比。 依据这些因素,可得出如下几点结论: (1)若n较小(如n值小于50),对排序稳定性不作要求时,宜采用选择排序方法,若关键字的值不接近逆序,亦可采用直接插入排序法。但如果规模相同,且记录本身所包含的信息域比较多的情况下应首选简单选择排序方法。因为直接插入排序方法中记录位置的移动操作次数比直...

hopegrace的博客 859
上一篇: 哈希表
下一篇: Computer Networks | OUTLINE 1.2 Network Hardware
Peggy_Chang
博客等级 码龄11年 21粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值