【转】八大排序算法总结

2023-11-12

插入排序

1.直接插入排序

原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。

要点:设立哨兵,作为临时存储和判断数组边界之用。

实现:

Void InsertSort(Node L[],int length)

{

Int i,j;//分别为有序区和无序区指针

for(i=1;i<length;i++)//逐步扩大有序区

{

j=i+1;

if(L[j]<L[i])

{

L[0]=L[j];//存储待排序元素

While(L[0]<L[i])//查找在有序区中的插入位置,同时移动元素

{

L[i+1]=L[i];//移动

i--;//查找

}

L[i+1]=L[0];//将元素插入

}

i=j-1;//还原有序区指针

}

}

2.希尔排序

原理:又称增量缩小排序。先将序列按增量划分为元素个数相同的若干组,使用直接插入排序法进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。

要点:增量的选择以及排序最终以1为增量进行排序结束。

实现:

Void shellSort(Node L[],int d)

{

While(d>=1)//直到增量缩小为1

{

Shell(L,d);

d=d/2;//缩小增量

}

}

Void Shell(Node L[],int d)

{

Int i,j;

For(i=d+1;i<length;i++)

{

if(L[i]<L[i-d])

{

L[0]=L[i];

j=i-d;

While(j>0&&L[j]>L[0])

{

L[j+d]=L[j];//移动

j=j-d;//查找

}

L[j+d]=L[0];

}

}

}

交换排序

1.冒泡排序

原理:将序列划分为无序和有序区,不断通过交换较大元素至无序区尾完成排序。

要点:设计交换判断条件,提前结束以排好序的序列循环。

实现:

Void BubbleSort(Node L[])

{

Int i ,j;

Bool ischanged;//设计跳出条件

For(j=n;j<0;j--)

{

ischanged =false;

For(i=0;i<j;i++)

{

If(L[i]>L[i+1])//如果发现较重元素就向后移动

{

Int temp=L[i];

L[i]=L[i+1];

L[i+1]=temp;

Ischanged =true;

}

}

If(!ischanged)//若没有移动则说明序列已经有序,直接跳出

Break;

}

}

2.快速排序

原理:不断寻找一个序列的中点,然后对中点左右的序列递归的进行排序,直至全部序列排序完成,使用了分治的思想。

要点:递归、分治

实现:


选择排序

1.直接选择排序

原理:将序列划分为无序和有序区,寻找无序区中的最小值和无序区的首元素交换,有序区扩大一个,循环最终完成全部排序。

要点:

实现:

Void SelectSort(Node L[])

{

Int i,j,k;//分别为有序区,无序区,无序区最小元素指针

For(i=0;i<length;i++)

{

k=i;

For(j=i+1;j<length;j++)

{

If(L[j]<L[k])

k=j;

}

If(k!=i)//若发现最小元素,则移动到有序区

{

Int temp=L[k];

L[k]=L[i];

L[i]=L[temp];

}

 

}

}

2.堆排序

原理:利用大根堆或小根堆思想,首先建立堆,然后将堆首与堆尾交换,堆尾之后为有序区。

要点:建堆、交换、调整堆

实现:

Void HeapSort(Node L[])

{

BuildingHeap(L);//建堆(大根堆)

For(int i=n;i>0;i--)//交换

{

Int temp=L[i];

L[i]=L[0];

L[0]=temp;

Heapify(L,0,i);//调整堆

}

}


Void BuildingHeap(Node L[])

{ For(i=length/2 -1;i>0;i--)

Heapify(L,i,length);

}

归并排序

原理:将原序列划分为有序的两个序列,然后利用归并算法进行合并,合并之后即为有序序列。

要点:归并、分治

实现:

Void MergeSort(Node L[],int m,int n)

{

Int k;

If(m<n)

{

K=(m+n)/2;

MergeSort(L,m,k);

MergeSort(L,k+1,n);

Merge(L,m,k,n);

}

}


基数排序

原理:将数字按位数划分出n个关键字,每次针对一个关键字进行排序,然后针对排序后的序列进行下一个关键字的排序,循环至所有关键字都使用过则排序完成。

要点:对关键字的选取,元素分配收集。

实现:

Void RadixSort(Node L[],length,maxradix)

{

Int m,n,k,lsp;

k=1;m=1;

Int temp[10][length-1];

Empty(temp); //清空临时空间

While(k<maxradix) //遍历所有关键字

{

For(int i=0;i<length;i++) //分配过程

{

If(L[i]<m)

Temp[0][n]=L[i];

Else

Lsp=(L[i]/m)%10; //确定关键字

Temp[lsp][n]=L[i];

n++;

}

CollectElement(L,Temp); //收集

n=0;

m=m*10;

k++;

}

}

 

原文来自:http://blog.csdn.net/yexinghai/archive/2009/10/10/4649923.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【转】八大排序算法总结 的相关文章

  • shell脚本“x$VARIABLE”中x的用途[重复]

    这个问题在这里已经有答案了 我正在查看一些 shell 脚本 comarison shcu 中 x 的用途是什么 if x USER x RUN AS USER then su RUN AS USER c CATALINA HOME bin
  • 列出破折号中当前定义的函数?

    我想列出当前定义的函数dash 有什么办法可以做到这一点吗 我能想到的最接近的是type它可以用来测试一个函数是否存在 但除此之外我很困惑 附 我说的是dash在这里 不是bash or zsh 看看 exec c 似乎没有 没有 表是静态
  • JPA更新一对多关系列表

    我有一个 Question 实体 其中包含另一个名为 Alternatives 的实体的列表 如下所示 public class Question OneToMany fetch FetchType LAZY mappedBy questi
  • Subversion 将未修改的文件标记为已修改

    这是我在使用 Subversion 时遇到的一个奇怪的问题 当从开发分支合并到主干 或返回 时 Subversion 会将许多文件标记为已更改 而它们没有任何更改 发生的情况如下 在我的分支中 我提交了 1 个修改过的文件 在主干中我合并了
  • 此 bash 命令在 Makefile 中未正确运行

    在 Makefile 里面我有这样的 release version poetry version cut f2 d echo release version 如果我运行 我的终端中的语句将毫无问题地运行 gt version poetry
  • git subtree pull -P 不管 总是合并冲突

    问题 即使我没有进行任何更改 每次尝试拉入子树时 我都会遇到合并冲突 我在做什么 In 子树仓库 Make some changes git commit am Changes made git push origin master In
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • 在 Fish Shell 中设置导出

    我安装了多个版本的 PHP 对于我的正常开发 我总是使用通过自制程序安装的 PHP 5 5 x 在鱼壳里 which php php version gt usr local bin php gt PHP 5 5 8 cli built J
  • xsel -o 对于 OS X 等效项

    是否有一个等效的解决方案可以在 OS X 中抓取选定的文本 就像适用于 Linux 的 xsel o 一样 只需要当前的选择 这样我就可以在 shell 脚本中使用文本 干杯 埃里克 你也许可以安装xsel在 MacOS 上 更新 根据 A
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • 如何使用 R 将每个文件的数据添加为附加行,从而将不同的 .csv 文件合并为一个完整的文件?

    我有几个不同的文件夹 它们都包含一个 csv 文件 所有这些 csv 文件都有一个单独的列 其中包含实验的一种条件的数据 我想以将每个文件的数据添加为新列的方式合并这些 csv 文件 目前 它看起来像这样 C1 csv 102 106 15
  • 如何在 shell 脚本中操作 $PATH 元素?

    有没有一种惯用的方法从类似 PATH 的 shell 变量中删除元素 这就是我想要的 PATH home joe bin usr local bin usr bin bin path to app bin and remove or rep
  • Rails/Ruby 合并两个具有相同键、不同值的哈希值

    我有两个想要合并的哈希值 它们看起来像这样 Hello gt 3 Hi gt 43 Hola gt 43 第二个哈希看起来像 Hello gt 4 Hi gt 2 Bonjour gt 2 我想合并这两个哈希数组 使结果看起来像 Hello
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 如何以管理员身份在 rake 任务中运行 shell 命令?

    我有一个简短的 cmd 文件 我想将其作为部署过程的一部分运行 不幸的是 cmd 文件需要管理员权限 是否可以从 rake 中获得管理员权限 或者我是否需要以管理员身份启动 shell 您可以尝试runas http ss64 com nt

随机推荐

  • 人工智能从头学(一)

    人工智能从头学 一 Python基础 本系列是对人工智能学习之路的一次复现与总结 适合期末突击复习概念知识点 回顾人工智能知识体系等场景 本文对纯小白极不友好 至少至少对计算机方向有个大概的了解 如有纰漏 欢迎指正 暂定计划 Python基
  • centos7 使用libvirt创建kvm虚拟机并vnc连接

    文章目录 环境 安装libvirt 查看libvirt的一些默认配置 查看libvirt的默认网络配置 kvm虚拟机搭建与连接 创建虚拟机 创建磁盘 下载镜像 使用libvirt创建kvm虚拟机 libvirt常用参数 创建kvm常用指令
  • android上实现Table

    package com android import java util ArrayList import java util HashMap import java util List import java util Map impor
  • 机器学习(十八) 方差、标准差、协方差、协方差矩阵、相关系数

    实例计算 学习数学理论发现还是懂了理论自己算一算 印象才深刻 记忆才清晰 并且在整理计算过程中会使得想法进一步加深 挖掘出来表面想象够不到的地方 先来看看统计学定义 大意是通过各种研究方法研究某一现象的内在规律 促进科学发展 统计学 统计学
  • Python 编写shell脚本

    详细讲解 shell中常用的是ls命令 python的写法是 os listdir dirname 这个函数返回字符串列表 里面是所有的文件名 不过不包含 和 os listdir python 把当前工作目录切换到dirname下 os
  • 30天学习之-自动化测试

    30天学习之 自动化测试 工具类实现自动化测试 1 postman自动化测试 1 postman Tests下写脚本 2 newman生成postman的测试报告 2 Jmter 基本操作 jmter基本元件 切换中文简体 登陆请求界面 自
  • 【精】与HDFS相关的Linux基础知识:内核是怎么保存文件描述符相关数据结构的?

    研究分布式文件存储系统 少不了与底层操作系统 文件系统 存储设备等打交道 了解这些基本原理对我们全方位理解分布式存储 问题定位 性能优化等有很大帮助 大家都知道 在linux中 一切都是文件 对文件的操作都是通过打开此文件拿到文件描述符 然
  • 数字大写

    人民币大写数字注意事项 中文大写金额数字应用正楷或行书填写 如壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万 亿 元 角 分 零 整 正 等字样 不得用一 二 两 三 四 五 六 七 八 九 十 廿 毛 另 或0 填写 不得自造简化字
  • OpenCV支持中文字符输出实现

    在 http www opencv org cn forum php mod viewthread tid 2083 extra page 1 中 作者给出了原始的在OpenCV中 支持中文字符的输入 原始的实现使用的是OpenCV的C接口
  • Win32API学习笔记第三章

    这次记录的是鼠标与键盘的消息和部分相应API的使用如与标准 本人学的是Win程序设计第五版 有偏差 或哪里有不妥 欢迎大家给予斧正 一 键盘 初阶 Windows有8种不同的消息来传递不同的键盘事件 但是其中的大部分是我们一般不会去处理的
  • 有哪些好用的App云测试平台?

    一 国内外6种好用app云测平台推荐 章节末附pk图 1 国内云测平台 1 Testin云测 网址 https www testin cn Testin云测平台是一款基于云端的移动应用测试平台 为移动应用开发者和测试人员提供一站式的移动应用
  • 永久关闭!

    永久关闭
  • 操作系统 -- CPU的调度策略 CPU Scheduling

    操作系统 CPU的调度策略 CPU Scheduling 进程状态 preemptive and non preemptive Scheduler解决的三个问题 什么时候切换进程 When 怎么将进程和CPU绑定 How 怎么选择需要执行的
  • 在Web上运行Linux

    原文地址 http coolshell cn articles 4722 html more 4722 一个叫Fabrice Bellard的程序员写了一段Javascript在Web浏览器中启动Linux 原网页 我把这个网页iframe
  • Laya页面嵌套和Scene.destory导致的Bug

    Laya2 1 1 1 参考 预设使用 Laya给出了相同模块 逻辑代码也相同情况下 使用页面嵌 runtime的使用方案 但是该方案和Laya Scene open Laya Scene destroy等有冲突 会导致bug 当参考使用L
  • QT如何获取QListWidget的Scroll值

    你可以使用 QListWidget 的 verticalScrollBar 方法来获取一个指向该 QListWidget 的垂直滚动条的指针 然后 你可以使用这个滚动条的 value 方法来获取滚动条的当前值 例如 QListWidget
  • LeetCode刷题记录

    目录 1 数组中重复的数字 本题考验沟通 1 原地置换法 2 哈希表 Set 2 二维数组中的查找 1 暴力法 双for 2 线性查找 3 替换空格 1 字符数组 2 Java自带方法 4 从尾到头打印链表 1 递归法 附加练习 链表 5
  • cytoscape使用方法_APT干货

    中科新生命 成立于2004年 专注于质谱技术方法在科技服务 生物医药 精准医疗领域的应用开发 12年质谱服务经验 每年处理本数超万例 通过与中科院的技术合作及企业研发团队的自主创新 致力成为您优秀的生物技术合作伙伴 每日关键点 Cytosc
  • .NET Core:搭建私有Nuget服务器以及打包发布Nuget包

    使用docker搭建私有Nuget服务器 docker run d p 8080 80 v PWD nuget db var www db v PWD nuget packages var www packagefiles e NUGET
  • 【转】八大排序算法总结

    插入排序 1 直接插入排序 原理 将数组分为无序区和有序区两个区 然后不断将无序区的第一个元素按大小顺序插入到有序区中去 最终将所有无序区元素都移动到有序区完成排序 要点 设立哨兵 作为临时存储和判断数组边界之用 实现 Void Inser