1. 程式人生 > >[C語言]用遞迴和非遞迴的方法在楊氏矩陣中查詢

[C語言]用遞迴和非遞迴的方法在楊氏矩陣中查詢

從楊氏矩陣中查詢數字,以及調整奇數位於陣列的前半部分

//從楊氏矩陣中查詢數字
//1.從右上角開始找,如果要找的值大於當前值,向下找,否則,向左找,方向確定
//2.從左下角開始找,如果要找的值大於當前值,向右找,否則,向上找,方向確定
//---->最大時間複雜度O(row + col) < O(N)
#include<stdio.h>
void find(int a[3][3],int row,int col,int k,int *px,int *py)
{
 //從右上角開始找
 int i = 0;
 int j = col - 1;
 while((i < row) &&
(j >= 0)) { //如果找到k的值,儲存k所表示的位置 if(a[i][j] == k) { *px = i; *py = j; return; } //如果當前值小於k,向下走 else if(a[i][j] < k) { i++; } //如果當前值大於k,向左走 else { j--; } } //沒有找到,賦無效值 *px = -1; *py = -1; } void find2(int a[3][3],int row,int col,int k,int *px,int *py) { //從左下角找
int i = row - 1; int j = 0; while((i >= 0) && (j <= col-1)) { if(a[i][j] == k) { *px = i; *py = j; return; } else if(a[i][j] < k) { j++; } else { i--; } } *px = -1; *py = -1; } //從右上角開始找,遞迴方法 int search(/*陣列資訊*/int a[3][3],int row,int col,/*查詢的數*/int
k,/*起始排查座標*/int x,int y, /*存放的位置*/int *px,int *py) { //出口 if((x >= row) || (y<0)) { //如果返回值為0,表示沒有找到 return 0; } if(a[x][y] == k) { *px = x; *py = y; //如果返回值為1,表示找到; return 1; } else if(a[x][y] > k) { //如果當前值大於k,向左走,找更小的值 return search(a,row,col,k,x,y-1,px,py); } else { //如果當前值小於k,向下走,找更大的值 return search(a,row,col,k,x+1,y,px,py); } } //從坐下角開始找,遞迴方法 int search2(/*陣列資訊*/int a[3][3],int row,int col,/*查詢的數*/int k,/*起始排查座標*/int x,int y, /*存放的位置*/int *px,int *py) { //出口 if((x < 0) || (y >= col)) { //如果返回值為0,表示沒有找到 return 0; } if(a[x][y] == k) { *px = x; *py = y; //如果返回值為1,表示找到; return 1; } else if(a[x][y] > k) { //如果當前值大於k,向上走,找更小的值 return search2(a,row,col,k,x-1,y,px,py); } else { //如果當前值小於k,向右走,找更大的值 return search2(a,row,col,k,x,y+1,px,py); } } int main() { int a[3][3] = {1,2,3,4,5,6,7,8,9}; int px = 0; int py = 0; int px1 = 0; int py1 = 0; int px2 = 0; int py2 = 0; int px3 = 0; int py3 = 0; find(a,3,3,9,&px,&py); printf("%d,%d\n",px,py); find2(a,3,3,9,&px1,&py1); printf("%d,%d\n",px1,py1); search(a,3,3,9,0,2,&px2,&py2); printf("%d,%d\n",px2,py2); search2(a,3,3,9,2,0,&px3,&py3); printf("%d,%d",px3,py3); return 0; }

調整奇數位於陣列的前半部分

#include<stdio.h>
void adjust(int arr[],int len)
{
 int left = 0;
 int right = len - 1;
 while(left < right)
 {
  //從左邊開始找第一個偶數
  while((left < right) && (arr[left] % 2 != 0))
  {
   left++;
  }
  //從右邊開始找第一個奇數
  while((left < right) && (arr[right] % 2) == 0)
  {
   right--;
  }
  if(left < right)
  {
   int temp = arr[left];
   arr[left] = arr[right];
   arr[right] = temp;
  }
 }
}
int main()
{
 int i = 0;
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
 int len = sizeof(arr)/sizeof(arr[0]);
 adjust(arr,len);
 for(i=0; i<len; i++)
 {
  printf("%d",arr[i]);
 }
 return 0;
}

要考慮到全是奇數或者全是偶數的情況!!