交换排序_冒泡排序_优化2(双向起泡)

可能大家又发现了,第一个优化算法只能找到底部排序好的,如果前几个也是排好序的呢?

就比如1 2 3   6 4 7 5   8 9 10 很明显,如果还按照第一个优化的方法来算话,前面排好序的

三个元素每次都要被扫描一次,如果有这种情况的话,就浪费了很多资源,所以我们将这个冒泡

从两头开始,一头从低到高,一头从高到低,原理是一样的。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 void BubbleSort(int *Array,int n){
 4     int boundmax=n;
 5     int boundmin=0;
 6     int flag1,flag2,i,a;
 7     while(boundmax>boundmin){
 8             flag1=0;
 9             flag2=0;
10     for(i=boundmin;i<boundmax-1;i++){         //将最大的排到最下面
11         if(*(Array+i)>*(Array+i+1)){
12             a=*(Array+i);
13             *(Array+i)=*(Array+i+1);
14             *(Array+i+1)=a;
15             flag1=i;
16         }
17     }
18     if(flag1==0)                            //如果等于0,表示已经排序完成,退出循环
19         break;
20     boundmax=flag1;
21     for(i=boundmax-1;i>boundmin;i--){         //将最小排到最上面
22         if(*(Array+i-1)>*(Array+i)){
23             a=*(Array+i-1);
24             *(Array+i-1)=*(Array+i);
25             *(Array+i)=a;
26             flag2=i;
27         }
28     }
29     if(flag2==0)
30         break;
31     boundmin=flag2;
32 }
33 }
34 int main()
35 {
36     int *p,n,i;
37     printf("请输入数组的个数:");
38     scanf("%d",&n);
39     p=(int*)malloc(sizeof(int)*n);
40     printf("输入元素:");
41     for(i=0;i<n;i++)
42         scanf("%d",p+i);
43     BubbleSort(p,n);
44     printf("排序后的数组:");
45     for(i=0;i<n;i++){
46         printf("%d ",*(p+i));
47     }
48     return 0;
49 }

但是我发现这样有一个致命的地方:有些重复出现的情况是不能很好的排序,

就比如

他假设前面已经排好序了。如果后面有前面排好序的元素,不会和前面的对比了。

原文地址:https://www.cnblogs.com/tangdingkang/p/10771883.html

时间: 2024-10-11 17:48:46

交换排序_冒泡排序_优化2(双向起泡)的相关文章

php排序介绍_冒泡排序_选择排序法_插入排序法_快速排序法

这里我们介绍一些常用的排序方法,排序是一个程序员的基本功,所谓排序就是对一组数据,按照某个顺序排列的过程. 充效率看 冒泡排序法<选择排序法<插入排序法 排序分两大类: 内部排序法 交换式排序法 冒泡法 基本思想: 冒泡排序法 案例: 1234567891011121314151617181920212223242526 //简单的$arr=array(0,5,-1); //现在我们把函数毛片封装成函数,利用以后使用//数组默认传递的是值,不是地址,&是地址符function bubb

Java_冒泡排序_原理及优化

冒泡排序及其优化 一.原理及优化原理 1.原理讲解 冒泡排序即:第一个数与第二个数进行比较,如果满足条件位置不变,再把第二个数与第三个数进行比较.不满足条件则替换位置,再把第二个数与第三个数进行比较,以此类推,执行完为一个趟,趟数等于比较的个数减一. 2.冒泡排序原理图示:(以98765序列为例,排序结果从小到大) 3.冒泡排序优化 优化版:每一次减少一次循环(即红色部分不需要在进行比较) 4.冒泡排序最终版 最终版:每一趟减少一次循环(删除线不需要再执行) 二.实现代码 1.冒泡排序实现主要代

搜狗拼音输入法7.2c正式版(支持win8)_去广告优化版

搜狗,狗种之王..... 去广告版本: ========= 1.去除多余皮肤.在线安装浏览器.升级文件 2.去除所有弹窗广告 3.安装后默认设置.不自动升级.开启模糊功能.不开启细胞和升级.不开启地址搜索与节日等功能. 4.增加安装时可选特效字体.图片表情.皮盒子.增加手写输入安装选项 5.默认不安装搜狗皮肤盒子.Flash皮肤 6.新增去除网址直达.搜索提示组件 7.支持winxp\Vista\win7\win8.支持32\64位 8.对卸载.安装进一步改善,完全支持不同版本覆盖安装.并且支持

软件测试_Loadrunner_APP测试_性能测试_脚本优化_脚本回放

本文主要写一下在使用Loadrunner录制完毕APP脚本之后如何对脚本进行回放,如有不足,欢迎评论补充. 如没有安装Loadrunner软件,请查看链接:软件测试_测试工具_LoadRunner: 如不清楚如何使用Loadrunner录制APP脚本,请查看链接:软件测试_APP测试_性能测试_脚本录制_基本操作流程: 先决条件:已录制完毕APP操作脚本.(我这里是录制了上传图片并查询的操作) 一.录制完毕脚本之后,点击保存.就能进入脚本优化界面,如下图: 二.然后点击上部菜单栏中的Script

IOS_地图_定位_天气预报_Block回调_单例

H:/1021/00_block回调.h /* 通过block回调 定义block代码块,目的是解析完成之后调用 返回值是 void 参数是 数组,里面的每个成员是一个NSString*/ typedef void(^WeatherFinishedBlock)(NSArray *dataList); @interface WeatherXMLPaser : NSObject // 解析器解析数据,参数1是要解析的数据,参数2是解析完毕回调的代码块 - (void)parserWeatherDat

交换排序之冒泡排序和快速排序

交换排序 所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动. 排序入门之冒泡排序 冒泡排序是典型的交换排序算法.冒泡排序的时间复杂度为O(n2),可以说效率比较低,但是,冒泡排序体现的思想是学习排序算法很好的入门,尤其是对学习快速排序(在冒泡排序基础之上发展起来的)很有帮助. 基本思想 冒泡排序的基本思想是,进行(最多进行)n-1趟冒泡,其中n为数据的个数,其中每次冒泡会将未排序的最大

流动法庭_流动审判车_巡回法庭_巡回审判车厂家技术参数

流动法庭_流动审判车_巡回法庭_巡回审判车厂家技术参数 Date:2015-12-07 ·巡回审判车介绍 巡回审判是指人民法院特别是基层人民法庭,为了方便人民群众诉讼,根据本地实际情况,深入农村及交通不便,人员稀少等偏远地区,就地立案,就地开庭,当庭调解,当庭结案的一种审判方式.实践中,各地实行流动办案,创造了许多巡回审判方式,被形象地称为"草原法庭","马背法庭","海上法庭","田间法庭". 该车具备合理布局,智能配置,可

交换排序(冒泡排序、快速排序)——Java

交换排序 (1)冒泡排序 1.基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 2.实例 3.java实现 public static void main(String[] args) { int []nums={57,68,59,52}; bubblesort1(nums); } /** * 它重复地遍历过要排序的数列,一次比较两个元素

好程序员Java学习路线分享冒泡排序及优化

? 好程序员Java学习路线分享冒泡排序及优化,冒泡排序是一定典型的交换排序,如排序规则是升序,有如下数列: ? A[0] A[1] A[2] A[3] ...... A[n] ? 将A[0]和A[1]比较,如果A[0]>A[1] ,则交换两个元素的位置,否则不变, 再继续比较A[1]和A[2],直到A[n-1]和A[n].即比较相邻的两个元素,如果前一个大,就交换(否则不交换),再继续比较后面的元素,每一轮比较之后,最大的元素会移动到最后(完成一轮冒泡):再开始第二轮冒泡,本次会选出第二大的元