数组的操作

来源:互联网 发布:virtualbox mac 编辑:程序博客网 时间:2024/05/17 05:16
调整数组使奇数全部都位于偶数前面。
题目:
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数上的数字位于数组的前半部分,所有偶数位上的数字于数组的后半部分。
#define _CRT_SECURE_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
void receser_arr(int arr[], int sz)
{
 int m = sz/ 2;
 int i = 0;
 while ((i+=2)<m)
 {
 
  *(arr + i - 1) = *(arr + i - 1) ^*(arr + sz - i);
  *(arr + sz - i) = *(arr + i - 1) ^ *(arr + sz - i);
  *(arr + i - 1) = *(arr + i - 1) ^ *(arr + sz - i);
 }
}
int main()
{
 int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 int sz = sizeof(arr) / sizeof(arr[0]);
 int i = 0;
 receser_arr(arr, sz);
 for ( i = 0; i < sz; i++)
 {
  printf("%d", arr[i]);
 }
 system("pause");
 return 0;
}
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数于数组的前半部分,所有偶数的数字于数组的后半部分。
#define _CRT_SECURE_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void odd_even(int arr[], int sz)
{
 assert(arr);
 assert(sz > 0);
 int *left = arr;
 int *right = arr + sz;
 while (left<=right)
 {
  if ((!(*left & 1)) && (*right & 1))
  {
   *left ^= *right;
   *right ^= *left;
   *left ^= *right;
   left++;
   right--;
   continue;
  }
  if (*left & 1)
  {
   left++;
  }
  if (!(*right & 1))
  {
   right--;
  }
 }
}
void show(int arr[], int sz)
{
 int i = 0;
 for ( i = 0; i <= sz; i++)
 {
  printf("%d ", arr[i]);
 }
 printf("\n");
}
int main()
{
 int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 int sz = sizeof(arr) / sizeof(arr[0])-1;
 show(arr, sz);
 odd_even(arr, sz);
 show(arr, sz);
 system("pause");
 return 0;
}


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

#define _CRT_SECURE_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
#define ROWS 3
#define LOWS 3
int check( int arr[ROWS][LOWS],int key,int left,int right,int up,int down)
{
 
 for (left;left <= right; left++)
 {
  for ( up; up <= down; up++)
  {
   if (key == arr[left][up])
   {
    return 1;
   }
  }
 }
}
int check_mach(int arr[ROWS][LOWS],int key,int row,int low)
{
 if ((key < arr[row / 2][0]) && (key < arr[0][low / 2]))
 {
  return check(arr, key, 0, row / 2, 0,low / 2);
 }
 if ((key < arr[row / 2][0]) && (key > arr[0][low / 2]))
 {
  return check(arr, key, 0, row / 2, low / 2,low);
 }
 if ((key >arr[row / 2][0]) && (key < arr[0][low / 2]))
 {
  
   return check(arr, key, row / 2,row, 0, low / 2);
 }
 if ((key > arr[row / 2][0]) && (key > arr[0][low / 2]))
 {
  return check(arr, key, row / 2, row, low / 2, low);
 }
 if (key == arr[row / 2][low / 2])
 {
  return 1;
 }
}
int main()
{
  int arr[ROWS][LOWS] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  int key = 0;
  printf("请输如要查找的数字:");
  scanf("%d", &key);
  if (check_mach(arr, key, ROWS, LOWS) == 1)
  {
   printf("YES");
  }
  else
  {
   printf("NO");
  }
  system("pause");
  return 0;
}
优化后
#define _CRT_SECURE_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
int check(int arr[][3], int key,int row,int low)
{
 int i = 0;
 int j = low-1;
 if ((key<arr[0][0])&&(key>arr[i][j]))
 {
  return 0;
 }
 while ((i<row) && (j>=0))
 {
  if (arr[i][j] > key)
  {
   j--;
  }
  else if (arr[i][j] < key)
  {
   i++;
  }
  else
  {
   return 1;
  }
 }
 return 0;
}
int main()
{
 int m = 0;
 int arr[3][3] = {
  { 1, 2, 3 },
  { 4, 5, 6 },
  { 7, 8, 9 },
 };
 int key = 0;
 printf("请输入一个数字;");
 scanf("%d", &key);
    m=check(arr, key, 3, 3);
 if (m)
 {
  printf("YES");
 }
 else
 {
  printf("NO");
 }
 system("pause");
 return 0;
}

原创粉丝点击