• 笔试题 相对位置不变的正负数排序


      笔试题目:假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,
    且保证负数件和正数间元素相对位置不变。时空复杂度要求分别为:o(n),o(1)。

    例如  
    -3 4 2 -1 7 3 -5
    排序后
    -3 -1 -5 4 2 7 3

      /*1.0版本思想*/

      考虑复杂度,我的实现方法是找到第一个postive,再找到第一个negative after the postive,然后进行类似一趟冒泡的排序,重复做下去,直到cann't find negative after the first postive.

      2.0版本是对1.0版的优化

    #include<stdio.h>
    void swap(int *a,int *b)
    {
        int temp=*a;
        *a=*b;
        *b=temp;
    }
    int main()
    {
        int a[7]={
            -3,4,2,-1,7,3,-5
        };
        /*2.0版本*/
        int length=sizeof(a)/sizeof(int);
        int i,temp;
        for(i=0;i<length;i++){
            if(a[i]<0){
                temp=i-1;
                while(temp>=0 && a[temp]>0){
                    swap(&a[temp+1],&a[temp]);
                    temp--;
                }
            }
        }
        /*1.0版本 写的有点笨重*/ 
        /*
        int pos_fir=-1,p,i;
        int n=sizeof(a)/sizeof(int);
        int temp;
        
        while(a[++pos_fir]<=0);//找到第一个正数位置 
        p=pos_fir;
        
        while(p<n){
            while(a[++p]>0);//find first negative after first postive
            
            if(p<n){ //类似与一趟冒泡 
                for(i=p;i>pos_fir;i--){
                    temp=a[i];
                    a[i]=a[i-1];
                    a[i-1]=temp;
                }
                p=pos_fir++; 
            }        
        }*/
        for(i=0;i<length;i++)
            printf("%d ",a[i]);
        
        
    }
  • 相关阅读:
    设计模式之观察者模式
    设计模式之外观模式
    设计模式之模板模式
    设计模式之装饰器模式
    设计模式之代理模式
    .NET常见问题汇总
    使用位运算计算两个整数的加减
    一个程序判断CPU是大端还是小端
    后缀表达式 转 表达式树
    实习一个月的小结
  • 原文地址:https://www.cnblogs.com/johnleo/p/neg_pos_sort.html
Copyright © 2020-2023  润新知