指针练习 与 杨氏矩阵 学习

1.调整数组使奇数全部都位于偶数前面。
要求
输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。
问题分析
题目要求将所有的奇数位于数组前半部分,偶数位于数组后半部分

  • 假定数组内容为{1,2,3,4,5,6}
    已知第一位为奇数,位于数组前半部分,所以我们可以从第一个偶数开始移动,设定一个指针p1指向第一个偶数的位置(为2的位置),在设定一个指针p2对数组进行遍历,当p2遍历到奇数时将该奇数向前移动到p1所指的位置(在检索到3是停止),依次达到将奇数前移,偶数后移的目的
  • 数组第一次移动: {1,3,2,4,5,6};
    此时因为指针并未移动所有p1所指为数字为3,第一个偶数因为一次的移动向后移动一位,所以p1++,保持所指的为第一个偶数。p2继续检索,查找下一个奇数。
  • 第二次移动:{1,3,5,2,4,6}
    当p2找到5时重复第一次移动过程,实现本次移动。直到p2检索到最后一个数字是停止。

程序实现


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

void MoveArr(int *str, int size)
{
	assert(str != NULL);
	int *p1 = str;
	int *p2 = str;
	int a = 0;
	int tmp = 0;
	int i = 0;
	for (i = 0; i < size; i++)
	{
		if (*p1 % 2 != 0)
		{
			p1++;
			p2++;
		}
		else
			break;
	}
	while (p2!=(str+size))
	{
		if ((*p2) % 2 != 0)
		{
			a = p2 - p1;
			for (i = 0; i < a; i++)
			{
				tmp = *(p2 - i);
				*(p2 - i) = *(p2 - i - 1);
				*(p2 - i - 1) = tmp;
			}
			p1++;
		}
		p2++;
	}
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	MoveArr(arr,sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ",arr[i]);
	}
	system("pause");
	return 0;
}

  1. 杨氏矩阵
    有一个二维数组:数组的每行从左到右是递增的,每列从上到下是递增的.
    在这样的数组中查找一个数字是否存在。
    时间复杂度小于O(N);

问题分析
给定一个简单的样式矩阵

1   2   3
3   6   9
4   8   10

结合该矩阵特点,每一行,每一列为递增,因为我们可以将数组的第一行与第一列,看为一个区间,在第一个由第一行月第一列所组成的区间里a[0][0],为这个区间最小的数字,a[0][2]为该行最大的数字,a[2][0]为该列最大数字,因此我先判断所要查找的数字是否在这个两个区间内,若在,则进行遍历查找。
第二个区间为第二行和第二列,因为在第一个区间时a[0][1],a[1][0]已经进行了遍历,因此第二个区间我们应从a[1][1]为起点开始,a[1][1]为该区间的最小值,a[1][2],a[2][1]为最大数字,判断所要查找的数字是否在这个区间内,如存在,遍历查找,反正开始在第三个区间内查找。
程序实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define SIZE 3

int FindNum(int arr[SIZE][SIZE], int size, int find)
{
	assert(arr != NULL);
	int i = 0;
	int j = 0;
	int p = 0;
		for (i = 0; i < size; i++)
		{
			if (find > arr[i][i])
			{
				if (arr[i][size-1]>=find)
				{
					for (p = i; p < size; p++)
					{
						if (arr[i][p] == find)
							return 1;
					}
				}
				if (arr[size-1][i]>=find)
				    for (p = i; p < size; p++)
				    {
				  	    if (arr[p][i] == find)
						     return 1;
				    }
			}
			else
				return 0;
		}
	
}
int main()
{
	int arr[SIZE][SIZE] = {1,2,3,3,7,9,4,8,10};
	int ret = 0;
	int find = 0;
	printf("请输入你要查询的数字:");
	scanf("%d", &find);
	ret = FindNum(arr,SIZE,find);
	if (ret == 1)
		printf("有这个数字\n");
	else
		printf("没有这个数字\n");
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值