1.调整数组使奇数全部都位于偶数前面。
题目:
输入一个整数数组,实现一个函数,
来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//分析: 因为冒泡排序有比较相邻两个元素的特性
//如果前后两个数为偶数和奇数,则交换位置,否则符合题目要求,不做变化。
void swap(int* x, int* y) { //交换函数
int temp = *x;
*x = *y;
*y = temp;
}
void Sort(int arr[], int len){
for (int i = len - 1; i > 0; i-- ) {
for (int j = 0; j < len - 1; j++) {
if ((arr[j] % 2 == 0) && (arr[j + 1] % 2 == 1)) {
swap(&arr[j], &arr[j + 1]);
}
}
}
}
int main() {
int arr[] = { 6, 5, 8, 1, 2, 7, 3, 4};
int len = sizeof(arr) / sizeof(arr[0]) ;
Sort(arr, len);
for (int i = 0; i < len; i++) {
printf("%d\t", arr[i]);
}
system("pause");
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
//分析: 每一行的最后一列元素是本行中的max值
// 每一列的最后一行元素为本列中的max值
// 将查询的数num与首行末元素比较,如果大,增加行号,直到小于为止。
//然后在小于的那一行,与前面的元素比较,如果找到,输出,未找到,结束
int Search(int arr[ROW][COL], int num) {
int i = 0, j = COL - 1;
int tmp = arr[i][j]; //将第一行末尾元素存储到tmp中
while (1) {
//进行比较
if (num == tmp) //找到
return 1;
else if (num < tmp && j > 0) //如果小于此元素,在这一行的前面找
tmp = arr[i][j--];
else if (num > tmp && i < ROW) //如果大于此元素,比较下一行的末尾元素
tmp = arr[i++][j];
else
return 0;
}
}
int main() {
int arr[ROW][COL] = {
{1, 2, 3, 4},
{2, 3, 6, 9},
{3, 4, 7, 12}
};
int num;
printf("请输入需要查询的数: ");
scanf("%d", &num);
int ret = Search(arr, num);
if (ret)
printf("找到了!\n");
else
printf("未找到!\n");
system("pause");
return 0;
}