数组题目:求更优解~~~

给定一个N个元素的整数,元素分别为A1,A2,A3....AN,将数组变为A1<A2>A3<A4......的锯齿状数组,时间复杂度

 

解:刚刚开始我的想法是,需要把它们先排序,如:1 2 3 4 5 67...然后在进行处理,原理是:首尾保持不变,从第二位和倒数第二位开始交换,然后index(下标)每隔2处理( 即lowIndex += 2;highIndex -= 2),结束条件就是 lowIndex>=highIndex;这样其实是可以的,但是大家知道在排序上就有点浪费时间了,后来想了一下没有必要排序的呀,只要保证以中位数为分界点,左边小于分界数,右边大于分界数就可以了,O(∩_∩)O~,那么代码就easy了~

 

>>>当然要解决此问题的办法就是首先我们需要转化成这样一个数组:中位数左边的都比它小,右边的都比他大,那么其实我们自己是可以写这个函数的,但是现在STL 中已经有了这样一个函数:STL样本 nth_element 函数!不会的自己看看去呗~O(∩_∩)O~,其实我们只要调用:nth_element( a, a + mid, a +allsize )就是可以做到的~ 呵呵,而且 STL 的库函数是有优化的哦,所以还是使用 STL的比较好,函数时间复杂度是O( n ),

主代码:( 仅供参考,人懒没有调试~O(∩_∩)O~ )(注意:这个参考代码摘自CSDN,非本人写 

int main()

{

    int a[] ={ 1, 5, 3, 7, 4, 2, 6 }; 
    intb[100]; 
    int size =sizeof( a ) / sizeof( a[0] ); 
    int mid =size / 2; 
    nth_element(a, a + mid, a + size );  
    int index1,index2, index3 = 0; 
    for( index1= 0, index2 = mid + 1; index1 < mid; index1++,index2++ ) //! 这个算法还是很灵活的 
   
    b[index3++] = a[index1]; 
    if( index2 < size ) 

    
         b[index3++] = a[index2]; 

    }
   
    b[index3] =a[mid]; 
   
    for( i1 = 0;i1 < size; ++i1 ) 
   
       cout << b[i1]<< " "; 
   

    return0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值