算法:以倒序排列一个数组

  • 算法核心思路

    • 用当前值与下一个值比较,如果当前值大于下一个值,则交换这两个值.否则不变且继续读取下一个值.
    for(i = 0;i<(n-1);i++)
    {
    	if(a[i] > a[i+1])
    	{
    		y = a[i];
    		a[i] = a[i+1];
    		a[i+1] = y;
    	}	
    
    • 交换值之后,往回比较,如果前一个值大于当前值,则交换这两个值,且更新当前值
    for(i_ = i ; a[i_] < a[i_-1] ; i_--) 
    		{	//只对前面排列好的再进行排列,所以i不用改变								
    			y = a[i_];
    			a[i_] = a[i_-1];
    			a[i_-1] = y;
    		}
    
    • 往回比较时需要注意比较到a[0]时的特殊情况,所以往回比较的时候,需要加一段判断的代码
    		if(i_ - 1 < 0)//检测是否排列到第一项 
    				break;
    			else
    				continue;
    
    • 结合起来就是
    double y;
    int i;
    int i_;
    for(i = 0;i<(n-1);i++)
    {
    	if(a[i] > a[i+1])
    	{
    		y = a[i];
    		a[i] = a[i+1];
    		a[i+1] = y;
    		
    		for(i_ = i ; a[i_] < a[i_-1] ; i_--) 
    		{	//只对前面排列好的再进行排列,所以i不用改变								
    			y = a[i_];
    			a[i_] = a[i_-1];
    			a[i_-1] = y;
    			
    			if(i_ - 1 < 0)//检测是否排列到第一项 
    				break;
    			else
    				continue;
    		}
    	}
    }
    
  • 整个程序

    #include<stdio.h>
    void inverted(double *a,int n);
    int main(void)
    {
    	const int n = 10;
    	double arr[n] = {2.3,44.5,217.0,17.5,22.4,3.4,87.4,0.2,6.9,1.1};
    	inverted(arr,n);
    	int i;
    	for(i = 0; i < n ; i++)
    		printf("%.2f  ",arr[i]);
    		
    	return 0;
    }
    
    void inverted(double *a,int n)
    {
    	double y;
    	int i;
    	int i_;
    	for(i = 0;i<(n-1);i++)//因为下面需要用a[i]与a[i+1]比较,所以要保证a[i+1]是个有效值
    	{
    		if(a[i] > a[i+1])
    		{
    			y = a[i];
    			a[i] = a[i+1];
    			a[i+1] = y;
    			
    			for(i_ = i ; a[i_] < a[i_-1] ; i_--) 
    			{	//只对前面排列好的再进行排列,所以i不用改变								
    				y = a[i_];
    				a[i_] = a[i_-1];
    				a[i_-1] = y;
    				if(i_ - 1 < 0)//检测是否排列到第一项 
    					break;
    				else
    					continue;
    			}
    		}
    	}
    }	
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值