算法大牛请进

abrom01 2013-11-25 03:42:22
有一个长度为2N的数组,有N个奇数,N个偶数,这些数字的位置任意,请写一个算法,要求:将奇数放在奇数位,偶数放在偶数位,并且时间复杂度位O(n),空间复杂度为O(1)。数组下标以0开始,即可认为是奇数位。
要求用JAVA语言实现。
...全文
244 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
genganpeng 2013-11-26
  • 打赏
  • 举报
回复


public class Split {
	public static void change(int[] array) {
		int i = 0, j = 1;
		while (j < array.length) {
			//从奇数下标开始遍历,找到第一个不是奇数的下标
			while(array[i] % 2 == 1) {
				i += 2;
			}
			//从偶数下标开始遍历,找到第一个不是偶数的下标
			while(array[j] % 2 == 0) {
				j += 2;
			}
			
			//两者交换
			int tmp = array[i];
			array[i] = array[j];
			array[j] = tmp;
			
			i += 2;
			j += 2;
		}
	}
	
	public static void main(String[] args) {
		int[] a = new int[]{2,1,6,4,3,5};
		change(a);
		for (int b : a) {
			System.out.println(b);
		}
	}
}
时间和空间复杂度都符合要求,不知道对不对~
abrom01 2013-11-26
  • 打赏
  • 举报
回复
引用 3 楼 gagewang1 的回复:

			int[] arr = {1,3,4,6,8,3};
			int [] temp = new int[arr.length];
			int oddIndex=1;//奇数的index
			int evenIndex=0;//偶数的index
			for(int num:arr){
				if(num%2==1){
					temp[oddIndex]=num;
					oddIndex +=2;
				}else{
					temp[evenIndex]=num;
					evenIndex +=2;
				}
			}
			for(int num:temp){
				System
空间上确实不合要求,要求是不能开辟新的内存空间
abrom01 2013-11-26
  • 打赏
  • 举报
回复
引用 2 楼 sunbo624 的回复:
自己写了一个,不知道时间复杂度和空间复杂度是否符合要求

public class Test {

	public static void main(String[] args) {
		
		int n = 8;
		
		int[] arr = new int[2 * n];
		
		boolean[] bs = new boolean[2 * n];
		
		Random ran = new Random();
		
		for(int i = 0; i < n; i++) {
			arr[i] = ran.nextInt(50) * 2 + 2;
		}
		
		for(int i = 2 * n - 1; i >= n; i--) {
			arr[i] = ran.nextInt(50) * 2 + 1;
		}
		
		for(int i = 0, j = 2 * n; i < j; i++) {
			
			int r = ran.nextInt(j);
			
			if(i == r) {
				continue;
			}
			
			arr[i] = arr[i] ^ arr[r];
			arr[r] = arr[i] ^ arr[r];
			arr[i] = arr[i] ^ arr[r];
			
		}
		
		for(int i = 0; i < n * 2; i++) {
			System.out.format("%d, ", arr[i]);
		}
		
		System.out.print("\n----------------------------------------------------\n");
		
		
		for(int i = 0, j = 2 * n; i < j; i++) {
			
			if(i % 2 == 0) {
				
				int k = i - 1;
				
				while(++k < j - 1 && arr[k] % 2 != 0);
				
				if(i != k) {
					arr[i] = arr[i] ^ arr[k];
					arr[k] = arr[i] ^ arr[k];
					arr[i] = arr[i] ^ arr[k];
				}
				
			} else {
				
				int k = i - 1;
				
				while(++k < j - 1 && arr[k] % 2 == 0);
				
				if(i != k) {
					arr[i] = arr[i] ^ arr[k];
					arr[k] = arr[i] ^ arr[k];
					arr[i] = arr[i] ^ arr[k];
				}
				
			}
			
		}
		
		for(int i = 0; i < n * 2; i++) {
			System.out.format("%d, ", arr[i]);
		}

	}

}
虽然看的不太懂,但是好像符合要求
abrom01 2013-11-26
  • 打赏
  • 举报
回复
引用 6 楼 ghw554557313 的回复:
void sortArray(int[] arr){
		for(int i = 0;i < arr.length;i++){
			for(int j = arr.length-1;j > i;j--){
				if(i == 0 && arr[i]%2 == 0){
					if(arr[j]%2 != 0){
						int temp = arr[i];
						arr[i] = arr[j];
						arr[j] = temp;
					}
				}else if(i % 2 != 0 && arr[i]%2 == 0){
					if(arr[j]%2 != 0){
						int temp = arr[i];
						arr[i] = arr[j];
						arr[j] = temp;
					}
				}
			}
		}
	}
算法不太好,冒了一下泡
这个时间复杂度不太符合要求把
ghw554557313 2013-11-26
  • 打赏
  • 举报
回复
void sortArray(int[] arr){
		for(int i = 0;i < arr.length;i++){
			for(int j = arr.length-1;j > i;j--){
				if(i == 0 && arr[i]%2 == 0){
					if(arr[j]%2 != 0){
						int temp = arr[i];
						arr[i] = arr[j];
						arr[j] = temp;
					}
				}else if(i % 2 != 0 && arr[i]%2 == 0){
					if(arr[j]%2 != 0){
						int temp = arr[i];
						arr[i] = arr[j];
						arr[j] = temp;
					}
				}
			}
		}
	}
算法不太好,冒了一下泡
sunbo624 2013-11-26
  • 打赏
  • 举报
回复
引用 4 楼 gagewang1 的回复:
[quote=引用 3 楼 gagewang1 的回复:]

			int[] arr = {1,3,4,6,8,3};
			int [] temp = new int[arr.length];
			int oddIndex=1;//奇数的index
			int evenIndex=0;//偶数的index
			for(int num:arr){
				if(num%2==1){
					temp[oddIndex]=num;
					oddIndex +=2;
				}else{
					temp[evenIndex]=num;
					evenIndex +=2;
				}
			}
			for(int num:temp){
				System
怎么少了一段。。。

		int[] arr = {1,3,4,6,8,3};
			int [] temp = new int[arr.length];//将arr按要求放进temp
			int oddIndex=1;//存放奇数的index
			int evenIndex=0;//存放偶数的index
			for(int num:arr){
				if(num%2==1){
					temp[oddIndex]=num;
					oddIndex +=2;
				}else{
					temp[evenIndex]=num;
					evenIndex +=2;
				}
			}
			for(int num:temp){
				System.out.println(num);
			}
[/quote] 这个用了两个数组 空间上不符合要求吧
oh_Maxy 2013-11-26
  • 打赏
  • 举报
回复
探讨下吧:

public class OddAndEven {

    /*
     有一个长度为2N的数组,有N个奇数,N个偶数,这些数字的位置任意,请写一个算法,
     要求:将奇数放在奇数位,偶数放在偶数位,并且时间复杂度位O(n),空间复杂度为O(1)。
     数组下标以0开始,即可认为是奇数位。要求用JAVA语言实现。
     */
    public static void main(String[] args) {
        // 待排序数字初始化:7个奇数,7个偶数
        int[] nums = { 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 2, 2, 2 };
        // 打印数组
        System.out.println("排序前:");
        printArray(nums);

        // 辅助变量:奇、偶数下标
        int oddIndex = -1;
        int evenIndex = -1;
        int temp;
        for (int i = 0, j = 1; i < nums.length || j < nums.length;) {
            // 若当前奇数位为偶数,且奇数位oddIndex=-1,则记录此下标
            if (i < nums.length && nums[i] % 2 == 0 && oddIndex == -1) {
                oddIndex = i;
            }

            // 若当前偶数位为奇数,且偶数位evenIndex=-1,则记录此下标
            if (j < nums.length && nums[j] % 2 == 1 && evenIndex == -1) {
                evenIndex = j;
            }

            // 根据下标判断,奇、偶下标是否需要+2
            if (oddIndex == -1) {
                i = i + 2;
            }
            if (evenIndex == -1) {
                j = j + 2;
            }

            // 若奇数位、偶数位下标都不为-1,则交换顺序
            if (oddIndex != -1 && evenIndex != -1) {
                temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;

                // 还原下标
                oddIndex = -1;
                evenIndex = -1;
            }
        }

        // 打印数组
        System.out.println("排序后:");
        printArray(nums);
    }

    // 打印数组
    private static void printArray(int[] nums) {
        if (null == nums) {
            return;
        }
        System.out.print("数组值:");
        for (int temp : nums) {
            System.out.print(temp + "  ");
        }
        System.out.println();
    }
}
中华雪碧 2013-11-25
  • 打赏
  • 举报
回复
引用 3 楼 gagewang1 的回复:

			int[] arr = {1,3,4,6,8,3};
			int [] temp = new int[arr.length];
			int oddIndex=1;//奇数的index
			int evenIndex=0;//偶数的index
			for(int num:arr){
				if(num%2==1){
					temp[oddIndex]=num;
					oddIndex +=2;
				}else{
					temp[evenIndex]=num;
					evenIndex +=2;
				}
			}
			for(int num:temp){
				System
怎么少了一段。。。

		int[] arr = {1,3,4,6,8,3};
			int [] temp = new int[arr.length];//将arr按要求放进temp
			int oddIndex=1;//存放奇数的index
			int evenIndex=0;//存放偶数的index
			for(int num:arr){
				if(num%2==1){
					temp[oddIndex]=num;
					oddIndex +=2;
				}else{
					temp[evenIndex]=num;
					evenIndex +=2;
				}
			}
			for(int num:temp){
				System.out.println(num);
			}
中华雪碧 2013-11-25
  • 打赏
  • 举报
回复

			int[] arr = {1,3,4,6,8,3};
			int [] temp = new int[arr.length];
			int oddIndex=1;//奇数的index
			int evenIndex=0;//偶数的index
			for(int num:arr){
				if(num%2==1){
					temp[oddIndex]=num;
					oddIndex +=2;
				}else{
					temp[evenIndex]=num;
					evenIndex +=2;
				}
			}
			for(int num:temp){
				System
sunbo624 2013-11-25
  • 打赏
  • 举报
回复
自己写了一个,不知道时间复杂度和空间复杂度是否符合要求

public class Test {

	public static void main(String[] args) {
		
		int n = 8;
		
		int[] arr = new int[2 * n];
		
		boolean[] bs = new boolean[2 * n];
		
		Random ran = new Random();
		
		for(int i = 0; i < n; i++) {
			arr[i] = ran.nextInt(50) * 2 + 2;
		}
		
		for(int i = 2 * n - 1; i >= n; i--) {
			arr[i] = ran.nextInt(50) * 2 + 1;
		}
		
		for(int i = 0, j = 2 * n; i < j; i++) {
			
			int r = ran.nextInt(j);
			
			if(i == r) {
				continue;
			}
			
			arr[i] = arr[i] ^ arr[r];
			arr[r] = arr[i] ^ arr[r];
			arr[i] = arr[i] ^ arr[r];
			
		}
		
		for(int i = 0; i < n * 2; i++) {
			System.out.format("%d, ", arr[i]);
		}
		
		System.out.print("\n----------------------------------------------------\n");
		
		
		for(int i = 0, j = 2 * n; i < j; i++) {
			
			if(i % 2 == 0) {
				
				int k = i - 1;
				
				while(++k < j - 1 && arr[k] % 2 != 0);
				
				if(i != k) {
					arr[i] = arr[i] ^ arr[k];
					arr[k] = arr[i] ^ arr[k];
					arr[i] = arr[i] ^ arr[k];
				}
				
			} else {
				
				int k = i - 1;
				
				while(++k < j - 1 && arr[k] % 2 == 0);
				
				if(i != k) {
					arr[i] = arr[i] ^ arr[k];
					arr[k] = arr[i] ^ arr[k];
					arr[i] = arr[i] ^ arr[k];
				}
				
			}
			
		}
		
		for(int i = 0; i < n * 2; i++) {
			System.out.format("%d, ", arr[i]);
		}

	}

}
Inhibitory 2013-11-25
  • 打赏
  • 举报
回复
这些数字有重复的吗? 时连续的吗?

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧