交换排序_冒泡排序_优化1

可能大家都发现了,假如最后几个元素是排好序的话,一直执行扫描其实是没有必要的

我们就可以进行优化一下。优化的原理就是没有进行位置交换,我们可以利用这点设置

一个标志位。标志位存储最后进行交换的元素的位置。

 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这个地址

应该是没分配的。

要是有错误的话,欢迎大家指出来。

猜你喜欢

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