1.快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

一趟快速排序的算法是:

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]的值交换;

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换。

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

C语言自带的快速排序:函数名称:qsort,在头文件:中

2.归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。

归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)

治的过程中用到了两个有序列的合并,如下图

代码如下

#include

#include

void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex)

{

int i = startIndex, j=midIndex+1, k = startIndex;

while(i!=midIndex+1 && j!=endIndex+1)

{

if(sourceArr[i] > sourceArr[j])

tempArr[k++] = sourceArr[j++];

else

tempArr[k++] = sourceArr[i++];

}

while(i != midIndex+1)

tempArr[k++] = sourceArr[i++];

while(j != endIndex+1)

tempArr[k++] = sourceArr[j++];

for(i=startIndex; i<=endIndex; i++)

sourceArr[i] = tempArr[i];

}

//内部使用递归

void MergeSort(int sourceArr[], int tempArr[], int startIndex, int endIndex)

{

int midIndex;

if(startIndex < endIndex)

{

midIndex = startIndex + (endIndex-startIndex) / 2;//避免溢出int

MergeSort(sourceArr, tempArr, startIndex, midIndex);

MergeSort(sourceArr, tempArr, midIndex+1, endIndex);

Merge(sourceArr, tempArr, startIndex, midIndex, endIndex);

}

}

int main(int argc, char * argv[])

{

int a[8] = {50, 10, 20, 30, 70, 40, 80, 60};

int i, b[8];

MergeSort(a, b, 0, 7);

for(i=0; i<8; i++)

printf("%d

快速排序算法_经常用到的的排序(快速排序和归并排序)简单的计算机算法学习...相关推荐

  1. java 最少使用(lru)置换算法_「面试」LRU了解么?看看LinkedHashMap如何实现LRU算法...

    以下内容均是本人原创,希望你看完之后能有更多更深入的了解,欢迎关注➕ 问题:使用Java完成一个简单的LRU算法 什么是LRU算法 LRU(Least Recently Used),也就是最近最少使用 ...

  2. 改进的有效边表算法_优硕微展 | 张和慧:基于邻域保持嵌入算法的间歇过程故障检测研究...

    基于邻域保持嵌入算法的 间歇过程故障检测研究 The Research on batch process fault detection based on Neighborhood Preservin ...

  3. 【算法】图(一)拓扑排序的实现 图的邻接表算法 判断是否图G中存在环

    文章目录 用list来表示图,判断是否存在环 邻接表实现拓扑排序 用DFS(邻接矩阵) 来实现拓扑排序. 判断无向图顶点是否全部连通 判断图G中从顶点u到v是否存在简单路径 输出图G中从顶点u到v的所 ...

  4. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

  5. matlab离群值算法_什么是离群值如何检测和删除它们对离群值敏感的算法

    matlab离群值算法 In statistics, an outlier is an observation point that is distant from other observation ...

  6. adam算法_梯度下降/批量(随机)梯度下降/动量法/RMSporp/Adam算法汇总

    我们在机器学习的过程中,当我们构建好我们的模型后要对输出构建损失函数.然后要不断的减小损失函数的值来不断更新优化我们模型中的参数. 那么如何优化我们的参数呢? 梯度下降法: 对1到M这些给出的数据计算 ...

  7. tarjan算法_【朝夕的ACM笔记】树上问题-最近公共祖先-倍增算法

    [朝夕的ACM笔记]目录与索引 最近公共祖先-倍增算法 一.基本概念 最近公共祖先问题:对于给定的一颗有根树,求其两个节点的最近公共祖先. 祖先:节点本身.节点的父亲.节点父亲的父亲--都是该节点的祖 ...

  8. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法

    黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...

  9. 室内定位算法_【好设计论文】基于行人航迹推算的室内定位算法研究

    摘要:针对室内定位的实际应用需求,提出了基于行人航迹推算算法(PDR)的适用于手机采集数据的室内定位方法.不同于传统的数据采集方法,该种定位方法利用手机得到加速度.陀螺仪以及地磁原始数据,通过分析加速 ...

最新文章

  1. 人工智能可能成为我们检测COVID-19最有效的方法吗?
  2. 如何手动重启Jenkins?
  3. 取景框图片 小程序_敲敲级简单的鉴别H图片的小程序
  4. 【Android NDK 开发】Kotlin 语言中使用 NDK ( 创建支持 Kotlin 的 NDK 项目 | Kotlin 语言中使用 NDK 要点 | 代码示例 )
  5. Win10+VS2015+EF6.0+MySQL5.6+MVC环境部署和排错
  6. [Java核心技术(卷I)] - 简易的日历
  7. 在FF与IE中使用数据岛
  8. conda配置环境变量并且激活
  9. 心理正常与异常的区分_教师培训 | 学生常见心理问题的表现与识别
  10. Android Activity 生命周期
  11. Audio之音频帧周期(四十三)
  12. Flutter之Stack
  13. html网页添加友链,教你如何添加网站友情链接
  14. PUTTY官网下载地址
  15. python中标点符号大全及名字_常见的标点符号大全及名字
  16. 主流编程语言的介绍及特点
  17. LG-P2342 叠积木
  18. MySQL 性能分析之 EXPLAIN 关键字
  19. 一个python文件调用另一个python文件
  20. 利用html 和css模仿必应搜索主页。(一)

热门文章

  1. 面试者为何从来得不到反馈?
  2. Libra 新编程语言 :Move 所有权模型灵感竟是来自它……
  3. Android 开发者成神之路!
  4. 让 API 端点的响应速度提高 50 倍!
  5. 500+ 精选 Java 面试题大放送
  6. 中国移动:部分 5G 手机可能有网连不上;iOS 13 出现严重漏洞;ReactOS 0.4.12发布 | 极客头条​...
  7. @程序员,别再让 Hotplug 问题难住你!
  8. 苹果抛弃 OpenGL!
  9. TIOBE 5 月编程语言排行榜:暴涨的 C,逆袭的 Scala
  10. 007. VMware 创建共享文件夹