1.调整数组使奇数全部都位于偶数前面。
题目:
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
#include <stdio.h>
void sort(int* a, int sz)
{
int left = 0;
int right = sz - 1;
for (left = 0; left != right; left++)
{
if (a[left]%2 != 0) //从前面开始为奇数继续
continue;
else //否则为偶数交换位置
{
int temp = a[left];
a[left] = a[right];
a[right] = temp;
if (a[right]%2 == 0)//从后面为偶数,不动j--
right--;
left--;
}
}
}
int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int sz = sizeof(a)/sizeof(a[0]);
int i;
sort(a, sz);
for (i = 0; i < sz; i++)
{
printf("%d ",a[i]);
}
return 0;
}
2. 杨氏矩阵
有一个二维数组,数组的每行从左到右是递增的,每列从上到下是递增的,在这样的数组中查找一个数字是否存在。
时间复杂度小于O(N);
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
1 2 3
4 5 6
7 8 9
#include <stdio.h>
//从右上角开始找
int Findnum1(int arr[3][3], int key, int rows, int cols)
{
int row = 0;
int col = cols-1;
while (((row >= 0) && (row < rows)) && ((col <= cols-1)))
{
if (key < arr[row][col])
{
col--;
}
if (key > arr[row][col])
{
row++;
}
if (key == arr[row][col])
{
return 1;
}
}
return 0;
}
//从左下角开始找
int Findnum2(int arr[3][3], int key, int rows, int cols)
{
int row = rows-1;
int col = 0;
while (((col >= 0) && (col < cols)) && (row <= cols-1))
{
if (key < arr[row][col])
{
row--;
}
if (key > arr[row][col])
{
col++;
}
if (key == arr[row][col])
{
return 1;
}
}
return 0;
}
int main()
{
int arr[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 10};
int key = 9;
int ret = Findnum1(arr, key, 3, 3);
{
if (ret == 0)
{
printf("不存在\n");
}
else if (ret == 1)
{
printf("存在\n");
}
}
return 0;
}