标题:c语言冒泡排序的改进代码
1.原理
1.选择两个数比较。(一般就是数组的第一个元素与第二元素)如果符合要求就交换这两个数。依次比较数组第二元素与第三元素比较直到比到数组的最后一个元素。这时最后一个元素就是最大或最小。把最后一个元素当成有序的。其余元素就是无序的。所以每次比完一次。有序的元素越来越多。无序的元素越来越少。当比完后全都是有序的。因为它像鱼泡一样一步一步往上升排成有序的所以叫冒泡排序。
2.问题1:1.当数组已经接近有序了。如果按照以前冒泡算法它还会一直比下去。比如:当已经是一组有序的数组int arr[]={1,2,4,6,8} 时。它还会比完所有次数。所以可以增加一个**标志位(flag)**当第一次外循环时。如果内循环的比较都没有交换一次说明它已经是一组有序数组。不需要在比下去。
问题2 当每次外循环都会多一个有序的数。无序的数就会少一个。当下一次外循环就只比较无序的数。有序的数就不需要比较。在内循环的判断上可以每次减小一次比较。
void sort1(int *p,int len)
{
for(int i=0;i<len-1;i++)
{
int flag=0; **//标志位 (问题1)**
for(int j=0;j<len-i-1;j++) **//内循环j每次减i (问题2)**
{
if(p[j]>p[j+1])
{
flag=1;
int temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
if(flag==0)
{
break;
}
}
}
3.方法2
1.ex变量就是保存最后一个无序数的下标。然后赋值给bound变量就是只比较无序的数。不比较已经排好的有序数从而减小比较次数.(解决上面的问题2)
如果是一组已经排好的数组那么ex没有变化。因为每次比较都没有交换ex一直等于0。while退出循环(解决上面问题1)可以通过调试慢慢去理解。
void sort(int *p,int len)
{
int ex=len-1;
int bound=0;
while(exchange)
{
bound=exchange;
exchange=0;
for(int j=0;j<bound;j++)
{
if(p[j]>p[j+1])
{
int temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
ex=j;
}
}
}
}