首页 > 试题广场 >

已知一个整数数组A[n],写出算法实现将奇数元素放在数组的左

[问答题]
已知一个整数数组A[n],写出算法实现将奇数元素放在数组的左边,将偶数放在数组的右边,且奇数升序排列,偶数降序排列,并给出时间复杂度和空间复杂度。
public static void quickSort(Integer[] arr){
        int left = 0;                
        int right = arr.length - 1;
        while (left < right){
            while (arr[left] % 2 != 0) left++;
            while (arr[right] % 2 == 0) right--;
            if(left < right) {
                int tmp = arr[left];
                arr[left] = arr[right];
                arr[right] = tmp;
            }
        }

        Arrays.sort(arr, 0, left);  //升序奇数区

        Arrays.sort(arr, left  , arr.length, new Comparator<Integer>() {
            public int compare(Integer integer, Integer t1) {   //降序偶数区
                return t1 - integer;
            }
        });
    }

发表于 2020-03-20 22:37:32 回复(0)
java代码:
public static void main(String[] args) {
	int[] arr = {1,52,9,6,23,4,3,7};
	int m = 0;
	int n = arr.length-1;
	for(int i = 0; i < arr.length; i++){
		if(arr[m] % 2 == 1){
		    m++;
	    }
	    if (arr[n] % 2 == 0) {
			n--;
		}
	    if ( m < n) {
			int x = arr[m];
			arr[m] = arr[n];
			arr[n] = x;
		}
	}
	for (int i = 0; i < arr.length; i++) {
		if (arr[i] % 2 == 1) {
			for (int j = i; j < arr.length; j++) {
				if (arr[i] > arr[j] && arr[j] % 2 == 1) {
					int p = arr[i];
					arr[i] = arr[j];
                    arr[j] = p;
				}
			}
		}
		if (arr[i] % 2 == 0) {
			for (int j = i; j < arr.length; j++) {
				if (arr[i] < arr[j] && arr[j] % 2 == 0) {
					int p = arr[i];
					arr[i] = arr[j];
					arr[j] = p;
				}
			}
		}
	}
}


发表于 2019-09-16 16:05:55 回复(0)
public static void main(String[] args) {
        Scanner sn = new Scanner(System.in);

        System.out.println("请输入数组:");

        String s = sn.nextLine();
        String[] sp = s.split(",");
        String t = "";
        
        int l=sp.length;
        String odd = "";
        String even = "";;
        // 奇偶分离
        for (int j = 0; j < sp.length; j++) {
            long num = Long.parseLong(sp[j]);
            if (num % 2 == 1) {
                odd+=sp[j];
                odd+=",";
            }else{
                even+=sp[j];
                even+=",";
            }

        }
        //然后偶数排序
        String odd2 = odd.substring(0,odd.length()-1);
        String[] odd1 = odd2.split(",");
        String even2 = even.substring(0,even.length()-1);
        String[] even1 = even2.split(",");
        for(int h=0;h<odd1.length;h++){
            for(int k=0;k<odd1.length;k++){
                if(Long.parseLong(odd1[h])<Long.parseLong(odd1[k])){
                    t=odd1[h];
                    odd1[h]=odd1[k];
                    odd1[k]=t;
                }
                
            }
        }
        //然后奇数排序
        for(int h=0;h<even1.length;h++){
            for(int k=0;k<even1.length;k++){
                if(Long.parseLong(even1[h])>Long.parseLong(even1[k])){
                    t=even1[h];
                    even1[h]=even1[k];
                    even1[k]=t;
                }
                
            }
        }
         //然后拼接一起
        String a="";
        
        for(int k=0;k<odd1.length;k++){
            a+=odd1[k];
        }
        
        for(int h=0;h<even1.length;h++){
            a+=even1[h];
        }
        
        
        System.out.print(a);


    }
发表于 2019-08-15 17:36:39 回复(0)

其他语言永远也体会不到C语言的快乐(尤其是C++
int cmp(const void* a,const void* b); 
void SORT()
{
	int i,flag=0;
	int b[MAXN];
	for(i=0;i<n;i++)	//先用数组b[n]临时存放a[n] 
		b[i] = a[i];
	qsort(b,n,sizeof(a[0]),cmp);//#include <stdlib.h>	从小到大快排
	//先处理所有奇数 
	for(i=0;i<n;i++)
		if(b[i]&1)
			a[flag++] = b[i];
	//再处理所有偶数 
	for(i--;i^(-1);i--)
		if(!(b[i]&1))
			a[flag++] = b[i];
}
int cmp(const void* a,const void* b)
{
	return *(int *)a - *(int *)b;
}

发表于 2019-08-14 20:45:02 回复(0)
	public static void sort(int[] a) {
		int temp;
		int oddEnd = 0; //最后一个奇数所在下标
		for (int i = 0; i < a.length; i++) {//奇偶分离
			if(a[i]%2==1) {//如果当前是奇数
				for (int j = 0; j < i; j++) {//找到第一个不是奇数的位置替换,最过分情况在原地不动
					if (a[j]%2==0) {
						temp = a[i];
						a[i] = a[j];
						a[j] = temp;
						oddEnd = j;
						break;	//找到第一个不是奇数的位置替换后 要 退出,确定奇数结束下标
					}
				}
			}
		}
		for (int i = 0; i <= oddEnd; i++) {//奇排
			for (int j = 0; j < oddEnd-i; j++) {
				if (a[j]>a[j+1]) {
					temp = a[j+1] ;
					a[j+1] = a[j];
					a[j] = temp;
				}
			}
		}
		for (int i = oddEnd+1; i < a.length; i++) {//偶排
			for (int j = oddEnd+1; j < a.length -1; j++) {
				if (a[j]<a[j+1]) {
					temp = a[j+1] ;
					a[j+1] = a[j];
					a[j] = temp;
				}
			}
		}
	}
	

发表于 2019-08-12 14:09:57 回复(0)