冒泡排序

数组下标   0      1     2     3     4      5
        初始数据   55    33   88   66   22   77
第一趟 完   33   55   66   22   77   88
第二趟 完   33   55   22   66   77   88
第三趟 完   33   22   55   66   77   88
第四趟 完   22   33   55   66   77   88
第五趟 完   22   33   55   66   77   88  
此数组有6个元素 需要比5趟  (定义变量 j 记录趟数,变量len表示数组元素个数)  for(j=0;j<len-1;j++)
每一趟的代码如下(变量i表示每一趟比较的次数)
for(i=0;i;i++)
{
if(arr[i]>arr[i+1])
{
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
                  }
      }

但是每一趟比完后都可以确定一个元素的位置,即:
第一趟需要比5次
第二趟需要比4次
第三趟需要比3次
第四趟需要比2次
第五趟需要比1次
优化后代码为:
  
for(i=0;i<len-1-j;i++)
{
if(arr[i]>arr[i+1])
{
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=temp;
}
}



完整代码如下:

#include<stdio.h>
void swap(int *p,int *q)
{
	int temp=*p;
	*p=*q;
	*q=temp;
}
void fun(int *a,int n)
{
    int k = n;
    for(int i=1;i<k;i++)
   {
        if(a[i-1]>a[i])
        {
              swap(&a[i-1],&a[i]);
         }
    }
    k--;
}
void main()
{
	int arr[]={2,5,8,1,3,4};
	int len=sizeof(arr)/sizeof(arr[0]);
	fun(arr,len);
	for(int i=0;i<len;i++)
	{
		printf("%d",arr[i]);
	}
}

若初始序列中有一部分已经有序 这个时候我们就不用重复的进行判断交换

优化后的代码如下

#include<stdio.h>
void swap(int *p,int *q)
{
	int temp=*p;
	*p=*q;
	*q=temp;
}
void fun(int *a,int n)
{
    bool flag = true;
    int k = n;
    while(flag)
    {
        flag = false;
        for(int i=1;i<k;i++)
        {
            if(a[i-1]>a[i])
            {
                swap(&a[i-1],&a[i]);
                flag = true;
            }
        }
        k--;
    }
}
void main()
{
	int arr[]={5,6,7,8,1,2,3};
	int len=sizeof(arr)/sizeof(arr[0]);
	fun(arr,len);
	for(int i=0;i<len;i++)
	{
		printf("%d",arr[i]);
	}
}


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值