C语言冒泡排序和选择排序_选择排序和冒泡排序哪个快

C语言冒泡排序和选择排序_选择排序和冒泡排序哪个快实例1 冒泡法排序数组中有N个整数,用冒泡法将它们从小到大(或从大到小)排序。实例解析:排序是非常重要且很常用的一种操作,有冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序等多种方法。这里我们先简单介绍前三种排序算法和代码的实现,其余算法将在后续课程《数据结构》中学习到。冒泡法排序是C语言教材中已经介绍过的排序方法,与其他排序方法比较起来,冒泡法效率是最低的,但因其算法

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

实例1 冒泡法排序

数组中有N个整数,用冒泡法将它们从小到大(或从大到小)排序。

实例解析:

排序是非常重要且很常用的一种操作,有冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序等多种方法。这里我们先简单介绍前三种排序算法和代码的实现,其余算法将在后续课程《数据结构》中学习到。

冒泡法排序是C语言教材中已经介绍过的排序方法,与其他排序方法比较起来,冒泡法效率是最低的,但因其算法简单,故也常被采用,其算法是:

1从第一个数开始,相邻两个数两两比较,将大的(或小的)交换到后面,然后继续比较第23个数…..当比较完最后两个数的时候,最大数(或最小数)便排在最后了。此过程称为一趟

(2)将最大数排除在外,其余数重复步骤1

(3)重复步骤2,直到所有数都排好为止。

对于有N个数的排序,上面的过程总共需要进行N-1趟。

下面是冒泡法排序的代码:

#include <stdio.h>

#define  N 10

int main()

{int  a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, t;

 for(i = 0; i < N-1; i++){     //共进行N-1

   for(j = 0; j < N–i-1; j++)  /*已排好的数据不参与比较 */

     if(a[j] > a[j+1]){  

       t = a[j];

       a[j] = a[j+1];

       a[j+1] = t;

     }

 }

 for(i = 0; i <= N-1; i++)

   printf(“%3d”, a[i]);

 printf(“\n”);

 getch();

 return 0;

}

实例2 选择法排序

数组中有N个整数,用选择法将它们从小到大排序。

实例解析:

选择法是被较多采用的一种排序方法,其效率比冒泡法高(交换数据的次数少),而算法却并未复杂多少。

选择法排序总的思路是:

1找出一个最小数,交换到最前面。

2在剩下的数里面,再找一个最小的,交换到剩下数的最前面

3、重复步骤,直到所有数都已排好。

显然,对于含有N个数的数组来说,其过程也要进行N-1 ( 0 <= i < N-1 )

上面所述步骤中,“找出一个最小数,交换到最前面”的方法是:

先将剩下数中的第一个数(序号是i)作为擂主,用变量k记下其序号,后面的数依次与擂主(注意:擂主是a[k],不总是a[i])比较,若比擂主还小,则用k记下其序号(注意:此时不要交换),当所有数都与擂主比较后,k中存放的就是最小数的序号,然后将它交换到最前面(现在才交换)。在上面的过程中,数据只交换了一次,即每趟只交换一次数据。

代码如下:

#include <stdio.h>

#define  N 10

int main()

{int  a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, k, t;

 for(i = 0; i < N-1; i++){          //共进行N-1

    /* 首先将最前面数当作擂主,记录其序号 */

k = i;                    //当进行第i趟时,最前面数的序号是

    /* 后面的每一个数都与擂主进行比较,以便找出最小数 */

for(j = i+1; j <= N-1; j++)   

      if(a[j] < a[k])          //擂主是a[k],未必总是a[i] 

        k = j;                  //若比擂主还小,则记录其序号

/* 将最小数交换到(剩下数的)最前面 */

    t = a[k];

    a[k] = a[i];

    a[i] = t;     

 }

 for(i = 0; i <= N-1; i++)

   printf(“%3d”, a[i] );

 printf(“\n”);

 getch();

 return 0;

}

实例3 插入排序

数组中有N个整数,用插入排序实现它们由小到大的排列。

实例解析:

插入排序也是常用的一种排序方法,效率较冒泡法高(一趟即可完成),但比选择法低(移动数据次数多)。其基本思想是:将数组分成两个区:前面是已排序的区域(有序区),后面是没有排序的区域(无序区)。每次都从无序区中取第一个数插入到有序区中适当位置,直到所有数据插入完毕为止。

算法的具体描述是:

待排序的数据存放在数组A[0, 1, …N-1]中,未排序前,A[0]自己是一个有序区,A[1, 2, …N-1]是无序区。程序必须从i = 1开始,直到i = N-1为止,每次将A[i]插入到有序区中。

插入排序与打扑克摸牌时的理牌过程很相似,当摸来第一张牌时,不需要排序,本身就是排好的(就一张),从第二张开始,每次摸来一张牌,必须插入到原来有序的扑克牌中的适当位置,而为了找到这个适当位置,需要将新摸来的牌与手中的牌进行比较。

基本的插入排序:

首先在有序区A[0,1,…i-1]中查找A[i]应该插入的位置k0 <= k <= i-1),然后将A[k,k+1,…i-1]中的数据各自后移一个位置,腾出位置k插入A[i]

若有序区所有数据均小于A[i]时,A[i]就应该在原位置不变,不需要插入。

改进后的插入排序:

将待插入的数据A[i]自右至左依次与有序区的数据A[i-1,i-2,…0]进行比较,若A[i]小于某数据A[j],则A[j]后移一个位置,继续与前面的数据比较……直到遇到比A[i]小的数据或前面已没有数据,则插入位置确定。

若碰到一个数据A[j]A[i]小,则A[i]应插入到位置j+1

A[i-1]A[i]小,则A[i]位置不变。

若所有数据都比A[i]大,则A[i]应插入到位置0

下面是改进后插入排序的代码:

#define  N 10

#include <stdio.h>

int main()

{int  a[N] = {3,5,2,9,7,4,8,1,0,6}, i, j, t;

 for(i = 1; i <= N-1; i++){

   t = a[i];                     //保存a[i],因a[i]会被覆盖

for(j = i-1; a[j]>t && j>=0; j–) // a[j]>t不能写成a[j]> a[i]

     a[j+1] = a[j];

   a[j+1] = t;

}

for(i = 0; i <= N-1; i++)

   printf(“%3d”, a[i] );

 printf(“\n”);

 getch();

return 0;

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/180505.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 密码学专题 SSL协议

    密码学专题 SSL协议SSL协议为不同的高层协议(http、FTP)提供安全服务 SSL握手协议、SSL修改密文协议和SSL告警协议的目的是为了管理和SSL相关的密文交换 连接:两台主机之间提供特定类型的数据传输,是点对点的关系;连接是短暂的,每一个连接都会和一个会话相互关联 会话:是指客户和服务器之间的关联,会话是通过握手协议创建的;会话是加密安全参数的一个集合,包含加密算法、临时的加密密钥等信息;会话可以为多个连接所共享,就可以避免为每个连接建立都要进行安全参数的协商带来的昂贵的时间代价。如果服务器和客户端之..

  • 计算机网络技术现代安防是啥意思,现代化校园视频安防监控系统 具有哪些特点呢…

    计算机网络技术现代安防是啥意思,现代化校园视频安防监控系统 具有哪些特点呢…原标题:现代化校园视频安防监控系统具有哪些特点呢校园视频安防监控系统主要是利用监控设备对学校场所进行全方位、全高清视频立体化管理和监控,从而维护校园秩序和安全,同时能为同学们的生活和学习营造更好的安全环境。那么现代化校园视频安防监控系统具有哪些特点呢?今天就和小编一起来学习了解下吧。1、可靠性与安全性校园视频安防监控系统的设计应具有较高的可靠性,在校园视频安防监控系统故障或事故造成中断后,能确…

  • 阿里云SSL证书免费申请方法(图文教程)

    阿里云SSL证书免费申请方法(图文教程)2022阿里云免费SSL证书品牌为DIgicertDV单域名证书,每个阿里云账号可以申请20个免费SSL证书资源包,SSL证书大全图文详解阿里云SSL证书免费申请教程,包括SSL证书申请域名DNS验证等操作:阿里云SSL证书免费申请方法1、打开阿里云SSL证书页面,点击“选购SSL证书”,如下图:阿里云SSL证书申请页面2、SSL证书服务选择“DV单域名证书【免费试用】”,如下图:按照以下选择:商品类型:SSL证书 SSL证书服务:DV单域名证书【免费试用】 数量:20.

  • pycharm英语怎么读_pycharm快捷键翻译「建议收藏」

    pycharm英语怎么读_pycharm快捷键翻译「建议收藏」翻译英语中文德语检测语言中文(简体)英语日语源语言:马耳他语———————–页面1———————–PyCharm默认的键盘对应PyCharm默认的键盘对应PyCharm默认的键盘对应编辑运行使用搜索按Ctrl+空格Basic代码完成(或任何类别,方法ALT+SHIFT+F10选择的配置和运行ALT+F7/按Ctrl+…

  • StretchDIBits函数显示图片

    StretchDIBits函数显示图片注:转载请注明出处。函数原型intStretchDIBits(HDChdc,intXDest,intYDest,intnDestWidth,intnDestHeight,intXSrc,intYsrc,intnSrcWidth,intnSrcHeight,CONSTVOID*lpBits,CONSTBITMAPINFO*lpBitsInfo,UINTiUs…

  • 《剑指offer》– 树的子结构、二叉树的镜像、二叉树的深度、平衡二叉树

    《剑指offer》– 树的子结构、二叉树的镜像、二叉树的深度、平衡二叉树

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号