可能大家又发现了,第一个优化算法只能找到底部排序好的,如果前几个也是排好序的呢?
就比如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