交换排序_冒泡排序_优化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 }

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

就比如

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

猜你喜欢

转载自www.cnblogs.com/tangdingkang/p/10771883.html
今日推荐