码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-04-26 00:08:36      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:不能   for   ret   图片   lag   原理   对比   pre   oid   

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

就比如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 }

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

就比如技术图片

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

 

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

标签:不能   for   ret   图片   lag   原理   对比   pre   oid   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!