第二十三章:杨氏矩阵查找、排序、添加、删除

2024-02-01 05:18

本文主要是介绍第二十三章:杨氏矩阵查找、排序、添加、删除,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Young氏矩阵

在一个m行n列二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

算法思想:


//杨氏矩阵
#include <iostream>    
using namespace std;  #define ROW 4
#define COL 4//杨氏矩阵调整,右下调整
void Young_down_heapify(int arr[][COL],int i,int j){int min_i,min_j;if (j+1<COL && arr[i][j]>arr[i][j+1]){min_i=i,min_j=j+1;}else {min_i=i,min_j=j;}if (i+1<ROW && arr[min_i][min_j] > arr[i+1][j]){min_i=i+1,min_j=j;} if (min_i!=i || min_j!=j ){swap( arr[i][j],arr[min_i][min_j]);Young_down_heapify(arr,min_i,min_j);}
}
//杨氏矩阵调整,左上调整
void Young_up_heapify(int arr[][COL],int i,int j){int max_i,max_j;if(j>0&&arr[i][j]<arr[i][j-1]){max_i=i,max_j=j-1;}else{max_i=i,max_j=j;}if(i>0&&arr[max_i][max_j]<arr[i-1][j]){max_i=i-1,max_j=j;}if(max_i!=i||max_j!=j){swap(arr[i][j],arr[max_i][max_j]);Young_up_heapify(arr,max_i,max_j);}
}
//pop出最小元素
int Young_pop(int arr[][COL]){int minV=arr[0][0];arr[0][0]=arr[ROW-1][COL-1];arr[ROW-1][COL-1]=INT_MAX;Young_down_heapify(arr,0,0);return minV;
}//删除元素
void Young_delete(int arr[][COL],int i,int j){arr[i][j]=arr[ROW-1][COL-1];arr[ROW-1][COL-1]=INT_MAX;Young_down_heapify(arr,i,j);
}void Young_insert(int arr[][COL], int key){if(arr[ROW-1][COL-1]<INT_MAX){cout<<"杨氏矩阵元素已满"<<endl;return;}arr[ROW-1][COL-1]=key;Young_up_heapify(arr,ROW-1,COL-1);
}
//杨氏矩阵查找迭代法
//从右上角到左下角搜索
bool Young_search(int arr[][COL],int target){int i=0,j=COL-1;int var=arr[i][j];while(true){if(var==target)return true;else if(var<target&&i<ROW-1)var = arr[++i][j];else if(var>target&&j>0)var = arr[i][--j];else return false;}
}
//杨氏矩阵查找递归版
bool Young_search(int arr[][COL],int i,int j,int key){if(i>=ROW||j<0)return false;if(arr[i][j]==key)return true;if(arr[i][j]<key)return Young_search(arr,i+1,j,key);else return Young_search(arr,i,j-1,key);
}
void Young_make(int arr[][COL],int key[]){for(int i=0;i<ROW*COL;i++){Young_insert(arr,key[i]);}
}
//排序
//设元素个数为n^2个,则时间复杂度为O(n^3)
void Young_sort(int arr[][COL]){cout<<"杨氏矩阵排序:"<<endl;for(int i=0;i<ROW*COL;++i){cout<<Young_pop(arr)<<"  ";}cout<<endl;
}
//print
void print(int arr[][COL]){for(int i=0;i<ROW;++i){for(int j=0;j<COL;++j)printf("%d\t",arr[i][j]);printf("\n");}
}
int main()  
{  //int arr[ROW][COL]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};//int target=13;//if(Young_search(arr,target))cout<<"存在"<<endl;//if(Young_search(arr,0,COL-1,target))cout<<"存在"<<endl;int key[]={1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};int arr[ROW][COL];for(int i=0;i<ROW;i++)for(int j=0;j<COL;j++)arr[i][j]=INT_MAX;////Young_make(arr,key);print(arr);//生成的杨氏矩阵为://1  2  4  6//2  4  7  8//8  9  10 11//9  12 13 15Young_sort(arr);
}  







这篇关于第二十三章:杨氏矩阵查找、排序、添加、删除的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/666187

相关文章

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略

SpringBoot项目删除Bean或者不加载Bean的问题解决

《SpringBoot项目删除Bean或者不加载Bean的问题解决》文章介绍了在SpringBoot项目中如何使用@ComponentScan注解和自定义过滤器实现不加载某些Bean的方法,本文通过实... 使用@ComponentScan注解中的@ComponentScan.Filter标记不加载。@C

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

Python按条件批量删除TXT文件行工具

《Python按条件批量删除TXT文件行工具》这篇文章主要为大家详细介绍了Python如何实现按条件批量删除TXT文件中行的工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.简介2.运行效果3.相关源码1.简介一个由python编写android的可根据TXT文件按条件批