调整数组的中的元素使奇数位于数组的前面,偶数位于数组的后面

分为两部分的问题,最好只用两个指针。

譬如此题:就可以一个指针从头往后扫,而另一个指针从后往前扫,保证第一个指针永远指向奇数,最后一个指针永远指向偶数,然后两者交换,直至最终两个指针相等,即扫描完了所有的元素。

代码如下所示:

 1 //调整数组顺序使奇数位于偶数前面
 2 #include<iostream>
 3 using namespace std;
 4 void function1(int* number, unsigned int length)
 5 {
 6     int p1 = 0;
 7     int p2 = length - 1;
 8     while (p1<p2)
 9     {
10         while (p1 < p2 && (number[p1] & 0x1) != 0)//p1指向的不是偶数,p1++
11             ++p1;
12         while (p1 < p2 && (number[p2] & 0x1) != 1)//p2指向的不是奇数,P2--;
13             --p2;
14         if (p1 < p2)//交换两个的值,注意:交换后的下一轮必然两个指针都会向中间靠拢
15         {
16             int temp = number[p1];
17             number[p1] = number[p2];
18             number[p2] = temp;
19         }
20     }
21 }
22 void print16(int* number, unsigned int length)//打印函数
23 {
24     for (int i = 0; i < length; ++i)
25         cout << number[i] << "    ";
26     cout << endl;
27 }
28 int main16()
29 {
30     int A[7] = { 1, 2, 3, 4, 5, 6, 7 };
31     function1(A, 7);
32     print16(A, 7);
33     system("pause");
34     return 0;
35 }

代码的鲁棒性:

 1 #include<iostream>
 2 using namespace std;
 3 void print16(int* number, unsigned int length)
 4 {
 5     for (int i = 0; i < length; ++i)
 6         cout << number[i] << "    ";
 7     cout << endl;
 8 }
 9 //代码的可重用性
10 void Reorder(int *pData, unsigned int length, bool(*func)(int))
11 {
12     int *pbegin = pData;
13     int *pend = pData + length - 1;
14     while (pbegin < pend)
15     {
16         while (pbegin < pend&&!func(*pbegin))
17             ++pbegin;
18         while (pbegin < pend&&func(*pend))
19             --pend;
20         if (pbegin < pend){
21             int temp = *pbegin;
22             *pbegin = *pend;
23             *pend = temp;
24         }
25     }
26 }
27 bool isEven(int n)
28 {
29     return (n & 1) == 0;
30 }
31 void ReorderOddEven(int *pData, unsigned int length)
32 {
33     Reorder(pData, length, isEven);
34 }
35 int main16()
36 {
37     int A[7] = { 1, 2, 3, 4, 5, 6, 7 };
38     //function1(A, 7);
39     //print16(A, 7);
40     ReorderOddEven(A, 7);
41     print16(A, 7);
42     system("pause");
43     return 0;
44 }
时间: 2024-10-13 23:21:52

调整数组的中的元素使奇数位于数组的前面,偶数位于数组的后面的相关文章

数组中的元素为奇数的平均值求出来

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn"> <head> <met

调整数组中的顺序使奇数位于偶数前边

输入一个整数数组,实现一个函数来调整该数组中字数的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 可以用运两个指针,第一个指针初始化时指向数组的第一个数字,它指向后移动.第二个指针初始化时指向数组的最后一个数字,它只向前移动,两个指针相遇之前,第一个指针总是位于第二个指针前边. (1)当第一个指针指向奇数时向后移动,当第二个指针指向偶数时向前移动: (2)反之交换这两个数字: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h

统计数组[1-n]中各个元素出现的次数,时间复杂度O(n),空间复杂度O(1),可改变数组结构

* 统计数组中每个元素出现的次数 * 数组长度为N,每个元素范围为[1,N]. * 统计各个元素出现的次数,要求时间复杂度为O(N),空间复杂度为O(1).可以修改数组中元素的值. * * 思路:遍历到每一个元素,将该(元素值 - 1)作为下标值,将该下标的元素赋值(若为正,赋值-1:若为负值,-1) * 最后,每个下标中存储的元素即为统计次数,而下标+1即为元素值. 代码: public static void main(String[] args) { // TODO Auto-genera

javascript删除数组/对象中的元素

一.数组: 代码: /* @desc:删除数组中的元素 @param arr 原数组 @param item 数组索引,只能是数字索引 @param len 要删除的长度 @return arr 删除元素后的数组 */ function unset(arr,item,len = 1){ arr.splice(item,len) return arr } 测试: var arr = new Array(1,2,3,4) var ret = unset(arr,1,2) console.log(re

数组求和,计算给定数组 arr 中所有元素的总和

一,题目分析:可以使用数组的归并方法计算,reduce和reduceRight.二者作用几乎相同.只是归并方向相反.reduce和reduceRight都可以接收两个参数.第一个是在每一项上调用的函数,第二个是归并基础的初始值. 二,解题. function sum(arr){ var sum=0; if(Array.prototype.reduce){ sum = arr.reduce(function(prev,cur,index,arr){ return prev+cur; }); ret

C#程序遍历数组A中所有元素

string[] A = new string[5] { "a1","a2","a3","a4","a5"}; //第一种方法 for (int i = 0; i < A.Length; i++) { Console.WriteLine(A[i]); } //第二种方法 IEnumerator e= A.GetEnumerator(); while (e.MoveNext()) { Console.W

计算给定数组 arr 中所有元素的总和的几种方法

1.forEach遍历: function sum(arr) {     var result = 0;     arr.forEach(function(item,index) {         result += item;     });        return result; }; 2.reduce function sum(arr) { return arr.reduce(function(pre,cur){ return pre+cur; }) } 3. eval functi

Java比较两个数组中的元素是否相同的最简单方法

呵呵呵,实现Java比较两个数组中的元素是否相同的功能你是怎么做的?看下面最简单方法: import java.util.Arrays; public class Test { /** * Java比较两个数组中的元素是否相同 */ public static void main(String[] args) { String [] array1 = {"1","2","3"}; String [] array2 = {"3"

c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。

将一个二维数组行和列的元素互换,存到另一个二维数组中. 解:程序: #include<stdio.h> int main() { int i, j, a[2][3] = { {1,2,3},{4,5,6} },b[3][2]; printf("array a:\n"); for (i = 0; i <=1; i++)//处理a数组中的一行中各元素 { for (j = 0; j <= 2; j++)//处理a数组中的某一列元素 { printf("%5