将一个数组的所有奇数位放在所有的偶数位之前

1.将一个数组的所有奇数位放在所有的偶数位之前

(1)代码思路:

设置两个指针,一个指向数组的首元素,一个指向数组的尾元素,先判断首元素,如果该元素是奇数,那么指针+1指向数组的下一个元素,如果是偶数那这个指针不变,开始判断尾指针,如果尾指针指向的是偶数,那么尾指针-1,指向它的前一个元素,如果尾指针指向的是一个奇数,那么尾指针不变,在首指针小于尾指针的情况下,交换首尾指针指向的元素,然后循环上述操作,直到尾指针小于等于首指针时停止。

 
 
#include<stdio.h>
#include<stdlib.h>

void Judge(int *p, int *q)
{
	int tmp = *q;
	*q = *p;
	*p = tmp;
    
}

void X(int arr[], int sz)
{
	int *left = &arr[0];
	int *right = &arr[sz];
	while(left < right)
	{
         while(((*left) % 2 != 0)&& (left < right))
		 {
			 left++;
		 }
		 while(((*right) % 2 == 0) && (left < right))
		 {
             right--;
		 }
		 Judge(left,right);
	}
}

int main()
{
	int a[] = {0};
	int n = 0;
	int i = 0;
	scanf("%d", &n);
	for(i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	X(a, n-1);
	for(i = 0; i < n; i++)
	{
		printf("%d", a[i]);
	}
	system("pause");
	return 0;
}


2.在杨氏矩阵中找一个数字,并且时间复杂度小于0(n)

(1)代码思路

用待查找元素与二维数组右对角线上的元素右依次比较,如果大于则与它这列下一行的数字比较,如果小于则在他所在行中,向前比较,就这依次寻找如果找到直接返回1,如果直到行数大于等于二维数组的行数或列数小于零则代表找不到。

 
 
#include<stdio.h>
#include<stdlib.h>

int Find(int arr[4][4],int *p, int *q, int x)
{
	*p = 0;
	*q = 3;
	do
	{
		if(arr[*p][*q] < x)
		{
			(*p)++;             //*p要加括号,因为*和++的优先级相同,如果不加()的话会从右向左运算
		}
		else if(arr[*p][*q] > x)
		{
                       (*q)--;
		}
		else
		{
			return 1;
		}
	}while((*p < 4)&&(*q >= 0));

    return 0;
}

int main()
{
	int a[4][4] = {{1,2 ,3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13,14,15,16}};
    int row = 0;
	int col = 3;
	int n = 0;
	int ret = 0;
	printf("请输入你要查找的数字\n");
    scanf("%d", &n);
	ret = Find(a,&row, &col, n);//
	if(ret == 1)
	{
		printf("存在,行为%d,列为%d\n", row+1, col+1);
	}
	else
	{
		printf("不存在");
	}

	system("pause");
	return 0;
}



猜你喜欢

转载自blog.csdn.net/ksaila/article/details/79940492