67,549
社区成员




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);
}
}
}
时间和空间复杂度都符合要求,不知道对不对~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;
}
}
}
}
}
算法不太好,冒了一下泡
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]
这个用了两个数组 空间上不符合要求吧
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();
}
}
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);
}
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
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]);
}
}
}