可能大家都发现了,假如最后几个元素是排好序的话,一直执行扫描其实是没有必要的
我们就可以进行优化一下。优化的原理就是没有进行位置交换,我们可以利用这点设置
一个标志位。标志位存储最后进行交换的元素的位置。
1 #include <stdio.h> 2 #include <stdlib.h> 3 void BubbleSort(int *Array,int n){ 4 int a,i,m,flag; //交换两个值的辅助变量 5 flag=n-1; 6 while(flag!=0){ 7 m=0; //假如下面没有交换,就是排完序了。 8 for(i=0;i<flag;i++){ 9 if(*(Array+i)>*(Array+i+1)){ 10 a=*(Array+i); 11 *(Array+i)=*(Array+i+1); 12 *(Array+i+1)=a; 13 m=i; //因为i会变化,所以也要存起来 14 } 15 } 16 flag=m; //把最后交换的位置给flag 17 } 18 } 19 int main() 20 { 21 int *p,n,i; 22 printf("请输入数组的个数:"); 23 scanf("%d",&n); 24 p=(int*)malloc(sizeof(int)*n); 25 printf("输入元素:"); 26 for(i=0;i<n;i++) 27 scanf("%d",p+i); 28 BubbleSort(p,n); 29 printf("排序后的数组:"); 30 for(i=0;i<n;i++){ 31 printf("%d ",*(p+i)); 32 } 33 return 0; 34 }
我看的书上是将flag赋值为n,我觉得不太对,我就改成了n-1,因为最差的情况
也只要扫描0到n-2(总共n-1次)。不然会指针越界。Array+(n-1)+1这个地址
应该是没分配的。
要是有错误的话,欢迎大家指出来。
原文:https://www.cnblogs.com/tangdingkang/p/10765555.html