数组中,奇数放前偶数放后

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

错误代码:

public class Solution {
    public void reOrderArray(int [] array) {
        int len=array.length;
        for(int i=0;i<len;i++){
            if((array[i]&1)==0){
                int j;
                for(j=i;j<len-1;j++)
                    array[j]=array[j+1];
                int temp;
                temp=array[i];
                array[j]=temp;
                i--;
            }
        }
    }
}

这段代码,i--  这个语句,会导致死循环。因为,到了数组某一阶段,i及其以后全是偶数,会一直循环,而且破坏稳定性。

改正:

public class Solution {
    public void reOrderArray(int [] array) {
        int len=array.length;
        int k=0;
        for(int i=0;i<len-k;i++){
            int temp;
            temp=array[i];
            if((array[i]&1)==0){
                int j;
                for(j=i;j<len-1;j++)
                    array[j]=array[j+1];
                array[j]=temp;
                i--;
                k++;
            }
        }
    }
}

这段代码,增加一个k,限制i的循环次数。关键是,i不需要遍历到最后。另外,如果想要让奇数向前,可以仿照上述代码,从后面遍历。

再有,完全仿照直接插入排序,奇数向前,同时从0遍历,注意一点:找到奇数后,要从第一个偶数开始向后搬运,再将奇数插入到原来第一个偶数的位置。

public class Solution {
    public void reOrderArray(int [] array) {
        int len=array.length;
        for(int i=0;i<len;i++){
            if((array[i]&1)==1){
                int k=0;
                while((array[k]&1)==1&&k<i) k++;   //找到前面第一个偶数
                if(k<i){
                    int temp=array[i];
                    int j;
                    for(j=i;j>k;j--)
                        array[j]=array[j-1];
                    array[j]=temp;
                }
            }
        }
    }
}

以上的时间复杂度是O(n2),如果再借用一个数组,将偶数放进去,然后再复制到原来的数组中,可实现时间复杂度为O(n)的算法

原文地址:https://www.cnblogs.com/heyboom/p/8653827.html

时间: 2024-08-29 19:25:51

数组中,奇数放前偶数放后的相关文章

【算法】 调整数组顺序,使得奇数在前偶数在后,分别保证奇数和偶数之间的相对位置不变

题目:输入一个整形数组,将数组重新排序,使得所有奇数在前偶数在后,并使奇数之间和偶数之间的相对位置爆出不变. 思想:从数组开头开始遍历所有数组.当碰到偶数时,将偶数打包,即记录到目前为止偶数的个数,把这些偶数看成一个整体:当碰到奇数时,将这个奇数与前面的偶数整体对调位置. #include <stdio.h> #include <stdlib.h> void nuo(int *a,int j,int nu)                     //将奇数与前面所有偶数调换位置

使用TreeSet和Comparator,写TreeSetTest2 要求:对TreeSet中的元素1,2,3,4,5,6,7,8,9,10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列

/* * 使用TreeSet和Comparator,写TreeSetTest2 *要求:对TreeSet中的元素1,2,3,4,5,6,7,8,9,10进行排列, *排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列 */ import java.util.Comparator; import java.util.TreeSet; public class TreeTest2 { public static void main(String[] args) { // TODO Aut

剑指offer——使数组中奇数全部位于偶数前面

从前往后找所要交换的两个数 void ReOrder(int* arr, int size) {     if (arr == NULL || size <= 1)return;     int i = 0,j = 0;     while (i < size&&j < size){         while (i < size && ((arr[i] & 0x01) == 1)){//找偶数             ++i;       

奇数在前偶数在后。各自反转后相连

#include <iostream> #include <stdlib.h> using namespace std; struct node { struct node *next; int value; }; node *CreateListNode(int value) { if(value==NULL) return NULL; node *pNode=(node*)malloc(sizeof(node)); pNode->value=value; pNode-&g

让数组中奇数位于偶数的前面

#include <iostream> using namespace std; void print(int *a,int n){ if(a==NULL || n<=0) return; for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<endl; } //快排的思想 int Partition(int *a,int left,int right){ int l=left; int

统计js数组中奇数元素的个数

如何统计一个JS数组中奇数元素的个数呢? 这是群友提出的一个问题,大部分群友给出的是遍历 然后对2取模,得到最终结果. 这样的写法是最容易想得到的,那么有没有其他思路呢? 这里我提供另外一种思路,我们知道奇数其实就是以 1 3 5 7 9 作为末尾结尾的数字,那么只要统计这些数字出现的次数就够了,但是光这样统计容易误算,所以我们可以先用逗号拼接起来,连着逗号一起计算,由于js没有php那么方便的能用substr_count 函数统计字符串出现次数,所以我们直接采用正则替换,计算长度差得到个数,代

查找一个数组中最小的前n项

/****************************************************************** find the biggest x number in a sequence* the basic method is the same as the QuickSort** 1. move the smaller one before the pivot* 2. move the bigger one after the pivot* 3. determin

使数组中奇数位于偶数前面

输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分 //第一种方法: #include <stdio.h> void reverse(int *p,int len) {  int *start = p;  int *end = p + len - 1;  int tmp = 0;  while (start < end)  {   if ((*start) % 2 == 1)   {    start++;   }

在一组降序排列的数组中插入一个数据,插入后,数组中数据依然按降序排列

分析: 1.数组固定,是一个倒序的数组 2.插入一个数据,这个数据插在哪呢,要比较,与数组中所有的元素比较,这里需要一个循环,因为是降序的数组,所以当第一次遇到比自己小的,那么这个位置就是要插入的位置 3.因为上一步被占了位置,那么从这个插入的数据开始,后面的原本的数据都得向右移一位 /** * */ package com.cn.u4; import java.util.Scanner; /** * @author Administrator *向有序数组中插入学员成绩 * 在一组降序排列的数