排序算法---快速排序、堆排序、冒泡排序

排序算法

  • 1 快速排序
    • 代码实现
    • stdlib库快排
  • 2 堆排序
    • 堆排序的基本思想
      • 如何构造一个大顶堆
      • 排序
  • 3 冒泡排序

1 快速排序

文章原地址:https://blog.csdn.net/morewindows/article/details/6684558
快速排序的平均时间复杂度是0(NlogN),它采用了一种分治的策略,通常称其为分治法。该方法的基本思想是:

  1. 先从数列中取出一个数作为基准数。
  2. 分区:将大于等于这个数放到它的右边,小于它的数全放在它的左边
  3. 再对左右区间进行快排

虽然快速排序称为分治法,但分治法这三个字显然无法很好概括快速排序的全部步骤,因此我对快速排序做了进一步的说明:挖坑填数+分治法。

以一个数组作为示例,取区间第一个数为基准数。
请添加图片描述
初始时,i = 0; j = 9; X = a[i] = 72

由于已经将a[0]中的数保存到X中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。

从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j–;

数组变为:
请添加图片描述

i = 3; j = 7; X=72

再重复上面的步骤,先从后向前找,再从前向后找。

从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;

从i开始向后找,当i=5时,由于i==j退出。

此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。依次类推。

代码实现

void quick_sort(int *arr,int l,int r)
{if(l<r){   int i=l,j=r,x=arr[i];while(i<j){/* 从右往左找小于x的值,找到之后,放到arr[i++] */while(i<j && arr[j]>=x){j--;}if(i<j){arr[i++]=arr[j];}/* 从左往右找大于等于x的值,找到之后,放到arr[j--] */while(i<j && arr[i]<x){i++;}if(i<j){arr[j--]=arr[i];}}/* 放x */arr[i]=x;/* 对x左右两个区间进行快排 */quick_sort(arr,l,i-1);quick_sort(arr,i+1,r);}
}

测试:

int main(void)
{int arr[]={72,6,57,88,60,42,83,73,48,85};quick_sort(arr,0,9);for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}

在这里插入图片描述

stdlib库快排

stdlib库提供了快排函数qsort

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
  • base是要排序的的数组
  • nitems是数组中元素个数
  • size是每个元素所占字节数
  • compar是比较函数
#include <stdio.h>
#include <stdlib.h>int cmp(void *a,void *b)
{return *(int *)a - *(int *)b;
}int main(void)
{int arr[]={72,6,57,88,60,42,83,73,48,85};qsort(arr,10,sizeof(int),cmp);for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}

2 堆排序

文章原地址:https://www.cnblogs.com/lanhaicode/p/10546257.html
堆是一个完全二叉树,通俗的说,堆就是利用完全二叉树的结构来维护的一维数组。
按照堆的特点可以把堆分为大顶堆和小顶堆:

  • 大顶堆:每个结点的值都大于等于其左右孩子的值
  • 小顶堆:每个结点都小于等于其左右孩子的值。

在用一维数组描述的堆中,如果父结点的下标是i,则左孩子的结点的下标是2i+1,右孩子是2i+2;所以如果孩子结点的下标是i,则父结点的下标结点j是:

j = (i-1)/2	/* 整数相除,取整,相当于向下取整数 */

我们用简单的公式来描述一下堆的定义:

  • 大顶堆:arr[i] >= arr[2*i+1] && arr[i] >= arr[2*i+2]
  • 小顶堆:arr[i] <=arr[2*i+1] && arr[i] <= arr[2*i+2]

下面以大顶堆为例。

堆排序的基本思想

将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点,然后把根结点和最后一个结点(数组最后一个元素)交换位置,那么末尾元素此时就是最大元素了。

  1. 先把n个元素的无序序列,构建成大顶堆
  2. 将根结点与最后一个元素交换位置。(将最大元素放到数组末端)
  3. 交换过后可能不再满足大顶堆的条件,所以需要将剩下的n-1个元素重新构建成大顶堆
  4. 重复第二步和第三步直到整个数组排序完成。

如何构造一个大顶堆

建立一个大顶堆是从最后一个非叶子结点开始从下往上调整的,也就是从最后一个结点的父结点开始。

这里以int a[6] = {7, 3, 8, 5, 1, 2}为例子。数组的长度是6,则最后一个结点的下标是5.
在这里插入图片描述

先要找到最后一个结点的父结点:(5-1)/2=2。2所对应的数是8。然后比较该结点值和它的左右孩子结点的值,如果小于其左右孩子的值,就交换,把最大左右孩子最大的值放到该结点
8只有一个左子树,左子树的值为2,不需要跳转
在这里插入图片描述
下一步,继续找到下一个非叶子结点(其实就是当前坐标-1就行了),该结点的值是3,小于其左子树的值,交换值。
在这里插入图片描述
在这里插入图片描述
下一步,继续找下一个非叶子结点,该结点的值是7,小于右子树,需要交换
在这里插入图片描述
在这里插入图片描述
下一步,检查调整后的子树,是否满足大顶堆的性质,如果不满足则继续调整(这里因为只将右子树的值与根节点互换,只需要检查右子树是否满足,而7>2刚好满足大顶堆的性质,就不需要调整了)

到这里大顶堆的构造就完成了。

排序

大顶堆已经构造好了,下一步交换根结点和最后一个结点(将最大值放到数组末端),此时最大的元素就归位了,然后对剩下的5个元素重复上面的步骤:
在这里插入图片描述
剩下只有5个元素,把剩下的结点变为大顶堆
在这里插入图片描述

将根结点(7)与最后一个结点交换:
在这里插入图片描述
依次类推,最后得到排好序的数组:
在这里插入图片描述

/* Function: 构建大顶堆 */
void BuildMaxHeap(int *heap, int len)
{int i;int temp;for (i = len/2-1; i >= 0; i--){if ((2*i+1) < len && heap[i] < heap[2*i+1])    /* 根节点小于左子树 */{temp = heap[i];heap[i] = heap[2*i+1];heap[2*i+1] = temp;/* 检查交换后的左子树是否满足大顶堆性质 如果不满足 则重新调整子树结构 */if ((2*(2*i+1)+1 < len && heap[2*i+1] < heap[2*(2*i+1)+1]) || (2*(2*i+1)+2 < len && heap[2*i+1] < heap[2*(2*i+1)+2])){BuildMaxHeap(heap, len);}}if ((2*i+2) < len && heap[i] < heap[2*i+2])    /* 根节点小于右子树 */{temp = heap[i];heap[i] = heap[2*i+2];heap[2*i+2] = temp;/* 检查交换后的右子树是否满足大顶堆性质 如果不满足 则重新调整子树结构 */if ((2*(2*i+2)+1 < len && heap[2*i+2] < heap[2*(2*i+2)+1]) || (2*(2*i+2)+2 < len && heap[2*i+2] < heap[2*(2*i+2)+2])){BuildMaxHeap(heap, len);}}}
}/* Function: 交换交换根节点和数组末尾元素的值*/
void Swap(int *heap, int len)
{int temp;temp = heap[0];heap[0] = heap[len-1];heap[len-1] = temp;
}int main()
{int a[6] = {7, 3, 8, 5, 1, 2};int len = 6;    /* 数组长度 */int i;for (i = len; i > 0; i--){BuildMaxHeap(a, i);Swap(a, i);}for (i = 0; i < len; i++){printf("%d ", a[i]);}return 0;
}

3 冒泡排序

https://www.runoob.com/w3cnote/bubble-sort.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目总结:华南师范大学校园开发教育android客户端总结

忽略之前小打小闹&#xff0c;这个项目算是我的第一个项目--SCNU的网络公选课的android版本的客户端。项目是从5月中旬开始的&#xff0c;中间经历了几个星期的复习考试时间&#xff0c;到现在可以说是完工了吧&#xff08;或许还有写细节要修改&#xff09;。这个项目带给我蛮…

Linux系统编程---守护进程

1 守护进程的概述 Daemon&#xff08;守护进程&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个用户程序提供服务。Linux系统的大…

邮箱服务器

一&#xff0e;邮箱服务器的基本概念 邮件的客户端&#xff1a;可以只安装在电脑上&#xff08;C/S&#xff09;的也可以是网页形式&#xff08;B/S&#xff09;的 邮件服务器&#xff1a;起到邮件的接受与推送的作用 邮件发送的协议&#xff1a; 协议&#xff1a;就是数据传输…

类加载器

一、类加载器 1&#xff0c;什么是类加载器&#xff1f; 类加载器就是用来加载字节码文件 2&#xff0c;类加载器的种类有哪些&#xff1f; 1&#xff09;BootStrap&#xff1a;引导类加载器&#xff1a;加载都是最基础的文件 2&#xff09;ExtClassLoader&#xff1a;扩展类加…

算法---链表

文章目录反转链表合并两个有序链表删除重复元素反转链表 反转链表包括两种&#xff0c;反转全部元素或者反转部分元素。在这里&#xff0c;我们约定&#xff1a;数据元素类型是struct LinkNode&#xff0c;要反转链表的第一个节点是head&#xff0c;head的前面一个节点是pre&a…

SSM

二、环境设置&#xff08;MyEclipse&#xff09; 1&#xff0c;字体设置 window–>Preference->General->Appearance->Colors and Fonts->Basic Text->Font 2&#xff0c;workspace字符集设置 window–>Preference->General->Appearance->W…

设计模式--Strategy 策略模式

所谓策略模式(Strategy Pattern)&#xff0c;就是将策略 (算法) 封装为一个对象&#xff0c;易于相互替换&#xff0c;如同 USB 设备一样可即插即用&#xff1b;如果将策略、具体的算法和行为&#xff0c;编码在某个类或客户程序内部&#xff0c;将导至事后的修改和扩展不易。 …

打开eclipse出现Failed to load the JNI shared library “D:\java\jdk\bin\...\jre\bin\server\jvm.dll”如何解决?

eclipse打开的时候出现Failed to load the JNI shared library “D:\java\jdk\bin…\jre\bin\server\jvm.dll”如何解决&#xff1f;&#xff1f; 如图所示&#xff1a; 即代表你的jdk与eclipse的位数不一样&#xff01;&#xff01;&#xff01; 你可以查看一下eclipse和jd…

圆形坠落模拟算法设计

目标&#xff1a;实现一个算法&#xff0c;模拟在一个封闭二维区域&#xff0c;圆形小球朝给定方向坠落的过程&#xff0c;实现二维区域的紧密填充。 像下面这样&#xff1a; 难点&#xff0c;及其简单解决&#xff1a; 1.如何把粒子移动尽可能远&#xff1f; 图中的粒子i&…

Maven详细教学

一、Maven简介 maven&#xff1a;是apache下的一个开源项目&#xff0c;是纯java开发&#xff0c;并且只是用来管理java项目的 依赖管理&#xff1a;就是对jar包的统一管理 可以节省空间 项目一键构建&#xff1a;mvn tomcat:run该代码可以将一个完整的项目运行起来&#xff0…

网站后台中对html标签的处理

最近做一个CMS&#xff0c;后台中需要使用在线编辑器对新闻进行编辑&#xff0c;然后发表。我用的在线编辑器是CKEditorCKFinder。也许是我为了让CKEditor更本地化吧&#xff0c;改了很多。后来发现在CKEditor中对文字设置字体、颜色、字号大小时文字的<span>标签会出现N…

<各国地图轮廓app>技术支持

如在app使用过程中遇到任何问题&#xff0c;请与开发者联系caohechunhotmail.com

ffplay SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can‘t initialize audio client“

windows下&#xff1a; ffplay 提示"SDL_OpenAudio (2 channels, 44100 Hz): WASAPI can’t initialize audio client" 添加环境变量&#xff1a;SDL_AUDIODRIVERdirectsound

(扩展)欧几里德快速幂

GCD模板 __int64 gcd(__int64 a,__int64 b) {return b0? a:gcd(b,a%b); } 欧几里德算法又称辗转相除法&#xff0c;用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理&#xff1a; gcd函数就是用来求(a,b)的最大公约数的。 gcd函数的基本性质&#xff1a; gcd(a,…

Silverlight + WCF异步调用 例子

看大家好像对我的NParsing框架不是很感兴趣&#xff08;写NParsing帖没人顶我&#xff09;&#xff0c;那就给大家来点“甜品”&#xff0c;换换口谓。来说说Silverlight方面的东西。 在Silverlight中数据通信只能用异步。有人会觉得写起来很麻烦&#xff0c;其实不然。也有很简…

小议SqlMapConfig.xml配置文件

①、mybatis-3-config.dtd 主要用于mybatis的核心配文件sqlMapConfig.xml的约束 sqlMapConfig.xml代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN&q…

ffmepg 命令提取音视频数据

原文件&#xff1a; 1&#xff1a; 原音频数据提取&#xff08;保留还是mp4的封装格式的&#xff09;&#xff1a; ffmpeg -i test_1920x1080.mp4 -acodec copy -vn audio.mp4 -vn 就是没有视频&#xff0c; -acodec copy 音频拷贝不进行任何转码 原视频数据提取&#xff0…

【7】jQuery学习——入门jQuery选择器之过滤选择器-可见性过滤选择器

这篇什么都不说&#xff0c;看标题就知道了&#xff0c;很简单&#xff0c;就2个选择器&#xff0c;嘿嘿 选择器描述返回$("Element:hidden")选取所有不可见的元素集合元素$("Element:visible")选取所有可见元素集合元素这篇很简单吧&#xff0c;就2个&…

Mybatis中的核心配置文件SqlMapConfig.xml详细介绍

一、properties&#xff08;属性&#xff09; 可以引用java属性文件中的配置信息如下 jdbc.properties代码如下&#xff1a; jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/mybatis?characterEncodingutf-8 jdbc.usernameroot jdbc.passwordbeyond…

用Kotlin开发您的第一个应用程序| Android与Kotlin

In the previous article, we learned how to setup Kotlin in the android studio? Now moving to journey ahead we are going to develop our first app with Kotlin. It is the basic app, but it will let you know the structure of the program. 在上一篇文章中&#x…