排序算法(一)-----冒泡法

冒泡法的本质就是相邻元素相互比较,比较大元素往上抛,正如气泡冒泡一下。故冒泡法得名。是交换法的一种。
/*该程序为最简单的冒泡法,不适用交换标志,使用两重循环,第一重循环我0~cn-1,第二重循环使用 i+1~ cn,
   交换元素使用i个跟第j个元素交换,其时间复杂度为O(n^2/2)*/
#include<stdio.h>
#define cnt 9
int b[cnt]={90,8,7,6,5,4,3,2,10};
void rearange(int b[],int k)
{  
	int i,j,qw=0;
    for(i=0;i<cnt-1;i++)
    for(j=i+1;j<cnt;j++)
    {  if(b[i]>b[j])
		{ 
		qw=b[i]; 
	    b[i]=b[j]; 
	    b[j]=qw;
		}
	}
}
void main(void)
{
   int qw=0;
	//int i,j,qw=0,k=0;
	printf("原数据如下:\n");
	while(qw<cnt)
   {
	   printf("%d\t",b[qw]);
		   qw++;
   }
	printf("\n");
	printf("the new rank is that:\n");
/*	for(i=0;i<cnt-1;i++)
    for(j=i+1;j<cnt;j++)
    {  if(b[i]>b[j])
		{ 
		qw=b[i]; 
	    b[i]=b[j]; 
	    b[j]=qw;
		printf("i=%d,j=%d\n",i,j);
        while(k<cnt)
	   {
			    printf("%d\t",b[k]);
		   k++;
		}
		k=0;
     printf("\n") ;
	  }
	}*/
	 qw=0;
	rearange(b,cnt);
    printf("重新排列后的数据如下:\n");
   while(qw<cnt)
   {
	   printf("%d\t",b[qw]);
		   qw++;
   }
   printf("\n");
}


附冒泡方法二: a[j]和a[j+1]交换。
i为:0~n-1;j<0~n-1-i.
void  rechange2(int a[],int n)
{
   int i,j;
   int temp;
   for (i=0;i<n-1;i++)
   	for(j=0;j<n-i-1;j++)
   	{
   	   if(a[j]>a[j+1]
   	   	{
	   	temp= a[j];
	   	a[j]=a[j+1];
	   	a[j+1]=temp;
   	   	}
   	}
	return;
}
为了减少交换次数,如果第一轮交换都不存在交换的话,说排序完成,不需要完成两轮循环
void  rechange3(int a[],int n)
{
   int i,j;
   bool exchange ;
   int temp;
   for (i=0;i<n-1;i++)
   {
   	 exchange=fasle;
   	for(j=0;j<n-i-1;j++)
   	{
   	   if(a[j]>a[j+1]
   	   	{
	   	temp= a[j];
	   	a[j]=a[j+1];
	   	a[j+1]=temp;
   	   	}
	    exchang=true;
   	}
	  if (!exchange)
	  	return;
   	}
	


猜你喜欢

转载自blog.csdn.net/fengliang191/article/details/38502495