作业:递归实现插入排序和在o(nlgn)时间复杂度内寻找和为定值的两个元素

2023-10-27

1、递归实现插入排序

基本思想:

可以把插入排序看作递归 地排序A[1..n-1]然后插入a[n]到已经排好序的序列a[1..n-1]中。

一下是实现算法(C#描述,VS205中调试通过)

 

class  InsertSort
    
... {
        
static void Main(string[] args)
        
...int[] array1=...{15,1,2333,4,5,67,24,645,253,8,9,34,22,100,22,23,45,67};
        ISort(array1, array1.Length);
        
for (int i = 0; i < array1.Length; i++)
        
...{
            Console.WriteLine(array1[i]);
        }

        Console.Read();
        }

        
//递归实现插入排序
        static void ISort(int[] a,int n) 
        
...{
            
if (n > 2)
                ISort(a, n 
- 1);
            InsertToArray(a[n 
- 1], a, n - 2);
            
        }

        
private static void InsertToArray(int data, int[] a, int last)
        
...{
            
while (last>=0 && data < a[last])
            
...{
                a[last 
+ 1= a[last];
                last
--;
            }

            a[last 
+ 1= data;
        }


    }

 

2、描述一个时间复杂度为o(nlgn)的算法找到在集合S中和为x的两个元素

基本思想:对集合s进行排序,时间复杂度为o(nlgn)的排序算法有快速排序,堆排序和归并排序。然后对已经排好序的序列进行一遍扫描找到两个元素。使得整个算法的时间复杂度为O(nlogn)。

实现算法(C#描述,VS205中调试通过,采用快速排序)

 

class  ElementsInS
    
... {
        
static void Main(string[] args)
        
...{

           Console.WriteLine(
"请输入数组S中的元素,以","分开");//输入数组S
           string s =Console.ReadLine();  //生成数组S
           string[]   a   =   s.Split(',');   
           List
<int>   ls   =   new   List<int>() ;  
           
foreach(string   t   in   a)   
            
...{   
                
int   i;   
                
if(int.TryParse(t,out i))  
                    ls.Add(i);   
            }

                Console.WriteLine(
"请输入数字S:");
                
int x =int.Parse(Console.ReadLine());       //输入和x
                int[] aa = new int[ls.Count];               //从List copy数组s
                ls.CopyTo(aa,0);

                myQuickSort(aa, 
0, ls.Count-1); //先对其进行快速排序时间复杂度为O(nlgn)
            
//以下循环一遍寻找两个元素
                int f = 0;
                
int l = aa.Length-1
                     
while(f<l)   
                        
...{   
                             
if(aa[f]+aa[l]   ==   x)   
       
                                 
...{
                                    Console.WriteLine(
"已经找到S的俩元素:" + aa[f].ToString() + "" + aa[l].ToString());
                                    
break;   //找到元素 
                                  }

                              
else   if(aa[f]+aa[l]>x)   //两数和大数已知数时,移动尾游标   
                                                --l;   
                              
else   //两数和小于已知数时,   移动头游标   
                                                ++f;   
                         }

                         
if (f >= l)
                         
...{
                             Console.WriteLine(
"数组s中没有和为" + x.ToString() + "的俩元素");
                         }


            Console.ReadLine();


        }

   
        
//以下为快速排序

            
private static void Swap(ref int i, ref int j)
            
//swap two integer 
            ...{
                
int t;
                t 
= i;
                i 
= j;
                j 
= t;
            }


            
public static void Sort(int[] list, int low, int high)
            
...{
                
if (high <= low)
                
...{
                    
//only one element in array list 
                    
//so it do not need sort 
                    return;
                }

                
else if (high == low + 1)
                
...{
                    
//means two elements in array list 
                    
//so we just compare them 
                    if (list[low] > list[high])
                    
...{
                        
//exchange them 
                        Swap(ref list[low], ref list[high]);
                        
return;
                    }

                }

                
//more than 3 elements in the arrary list 
                
//begin QuickSort 
                myQuickSort(list, low, high);
            }


            
public static void myQuickSort(int[] list, int low, int high)
            
...{
                
if (low < high)
                
...{
                    
int pivot = Partition(list, low, high);
                    myQuickSort(list, low, pivot 
- 1);
                    myQuickSort(list, pivot 
+ 1, high);
                }

            }


            
private static int Partition(int[] list, int low, int high)
            
...{
                
//get the pivot of the arrary list 
                int pivot;
                pivot 
= list[low];
                
while (low < high)
                
...{
                    
while (low < high && list[high] >= pivot)
                    
...{
                        high
--;
                    }

                    
if (low != high)
                    
...{
                        Swap(
ref list[low], ref list[high]);
                        low
++;
                    }

                    
while (low < high && list[low] <= pivot)
                    
...{
                        low
++;
                    }

                    
if (low != high)
                    
...{
                        Swap(
ref list[low], ref list[high]);
                        high
--;
                    }

                }

                
return low;
            }


        }
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

作业:递归实现插入排序和在o(nlgn)时间复杂度内寻找和为定值的两个元素 的相关文章

  • Python range() 和 zip() 对象类型

    我了解功能如何range and zip 可以在 for 循环中使用 然而我期望range 输出一个列表 很像seq在 Unix shell 中 如果我运行以下代码 a range 10 print a 输出是range 10 表明它不是一
  • python中的列表列表的集合

    我有一个列表列表 mat 1 2 3 4 5 6 1 2 3 7 8 9 4 5 6 我想转换成set即删除重复列表并从中创建一个新列表 其中仅包含unique lists 在上述情况下 所需的答案将是 1 2 3 4 5 6 7 8 9
  • Powershell 添加的字符串类型的 ParameterizedProperty Chars 属性是什么?

    请注意 C gt Get Member MemberType eq ParameterizedProperty TypeName System String Name MemberType Definition Chars Paramete
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • C# 中单个 & 符号的第二个含义是什么?

    我在 C 中使用了单个与号 来表示 检查second条件语句即使第一个是false 但以下似乎是不同的意思 of 总而言之 谁能解释一下如何i 1在下面的例子中有效吗 List
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 使用 for 循环填充 python 字典列表

    我试图用 for 循环填充字典列表 但最终结果显示 for 循环填充的最后一个字典覆盖了所有先前字典的值 我尝试调整以下中提出的解决方案 如何使用循环填充 Python 字典 https stackoverflow com question
  • 如何在字符串vba中包含引号

    我想存储以下文本 Test1 Monday Test Abcdef 全部在字符串中包含引号 我知道要在字符串中包含引号 我必须包含 之前 但在这里这不是一个很好的解决方案 因为我在文本中有太多这样的解决方案 知道如何一次完成这一切吗 您有两
  • Python 将列表追加到列表中

    我正在尝试编写一个通过矩阵的函数 当满足条件时 它会记住该位置 我从一个空列表开始 locations 当函数遍历行时 我使用以下方法附加坐标 locations append x locations append y 函数末尾的列表如下所
  • 从另一列的子字符串创建列

    我有一个 Pandas 数据框对象 我想从现有列的子字符串创建新列 我的数据如下所示 Date variable want1 want2 want3 0 02 01 08 Australia Sydney A Australia Sydne
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • 十六进制字符串的运行长度编码(包括换行符)

    我正在使用以下方法实现游程长度编码GZipStreamC winforms 应用程序中的类 数据以一系列由换行符分隔的字符串形式提供 如下所示 FFFFFFFF FFFFFEFF FDFFFFFF 00FFFFFF 在压缩之前 我将字符串转
  • 生成逗号分隔值

    假设我有一个字符串集合 foo bar xyz 我想从列表中生成一个逗号分隔的值 如下所示 foo bar xyz 请注意末尾缺少 我知道有多种方法可以生成此内容 使用 for 循环和 string Format 或 StringBuild
  • Collections.sort(list) 和 list.sort(Comparator) 之间的区别

    有什么理由让我应该选择Collections sort list 方法而不是简单地调用list sort 内部Collections sort只是调用sort的方法List无论如何 上课 令人惊讶的是几乎每个人都告诉我使用Collectio
  • 将 std::string 从 C++ DLL 返回到 c# 程序 -> 指定给 RtlFreeHeap 的地址无效

    在我的 C DLL 中的函数中 我将 std string 返回到我的 C 应用程序 它几乎看起来像这样 std string g DllName MyDLL extern C THUNDER API const char stdcall
  • 如何在 flutter 中仅显示列表中的 5 项

    我想在 flutter 中显示一个列表 我正在使用listView 问题是我只想显示 5 个项目 我的意思是当用户向下滚动时我想从开始索引中删除并将另一个小部件添加到包含我的小部件的列表的末尾 但是当我这样做时ScrollView 不会停留
  • 两个布尔列表之间的逻辑运算

    我得到了一个奇怪的结果 我尝试应用and or the orpython 中 2 个布尔列表的运算符 事实上 我得到的结果与我的预期完全相反 True False False and True True False gt True True
  • scala 返回列表中的第一个 Some

    我有一个清单l List T1 目前我正在执行以下操作 myfun T1 gt Option T2 val x Option T2 l map myfun l flatten find gt true The myfun函数返回 None
  • 如何在Python中按AaB而不是ABa顺序对字符串进行排序

    我正在尝试对字符串进行排序 为 punnetsquare 制作基因型 我目前的实现是 unsorted genotype ABaB sorted genotype sorted list unsorted genotype sorted s
  • 从列表python的单个列表中删除子列表

    我已经经历过从列表列表中删除子列表 https stackoverflow com questions 47209786 removing sublists from a list of lists 但当我为我的数据集扩展它时 它不适用于我

随机推荐

  • VUE 配置环境变量

    vue 环境变量配置 参考文章 一颗小芹菜的日常 参考文章2 sunshineG env production 和 env development 文件 env production 文件是生产环境下的文件 env development
  • Java枚举的使用

    枚举类型可以取代以往常量的定义方式 即将常量封装在类或接口中 此外 枚举类型还提供了安全检查功能 枚举类型本质上还是以类的形式存在 1 使用枚举类型设置常量 以往设置常量 通常将常量放置在接口中 这样在程序中就可以直接使用了 并且该常量不能
  • springboot整合kafka

    文章目录 步骤一 添加依赖项 步骤二 配置 Kafka 步骤三 创建一个生产者 步骤四 创建一个消费者 本教程将介绍如何在 Spring Boot 应用程序中使用 Kafka Kafka是一个分布式的发布 订阅消息系统 它可以处理大量数据并
  • JS使用IntersectionObserver进行图片懒加载

    JS图片懒加载 使用IntersectionObserver来进行图片懒加载 可能有兼容性问题 用isIntersecting属性判断是否加载图片 代码如下 下面展示一些 内联代码片
  • HTML统计用户浏览页面时间,js记录用户在网站的浏览记录和停留时间(2)

    问题 上次的代码确实解决了一部分用户访问记录的收集 但是还是存在一个问题就是 我们网站的注册 都是新页面打开的 如果用户刚进入网站就点击注册 打开了新的页面 我代码里用到的 onbeforeunload 就无法将用户进入的页面存储到本地了
  • GitKraken第一次使用创建仓库,出现提示克隆失败会话认证失败,无法打开公钥文件

    原因分析 自己添加了ssh密钥 在创建仓库时 会有一个show detail ssh setting 如果你和我一样点开了 并把这个密钥加到了GitHub 并且收到了邮件 恭喜你 犯了和我一样的错 解决方案 解决很简单 remove 移除那
  • 【NAS群晖drive异地访问】远程连接drive挂载电脑硬盘「内网穿透」

    文章目录 前言 1 群晖Synology Drive套件的安装 1 1 安装Synology Drive套件 1 2 设置Synology Drive套件 1 3 局域网内电脑测试和使用 2 使用cpolar远程访问内网Synology D
  • 微信小程序WebSocket使用案例

    一 Asp Net Core 6服务器端代码 服务器端WebScoket代码同上一篇博文 Asp Net Core6 WebSocket 简单案例 天马3798的博客 CSDN博客 二 微信小程序端WebSocket使用整理 1 wx co
  • day34 贪心

    1005 K次取反后最大化的数组和 按照一定的策略 先绝对值排序 再负数修正 最后对绝对值最小的数进行替换 再求和 134 加油站 判断是否可以从i 到达i 1 判断gas总量是否大于cost 135 分发糖果 采用两次遍历计算糖果数 pa
  • KEIL3新建TA89C51工程

    1 新建一个文件夹命名为TEST 如图所示 2 在TEST文件夹里面新建一个LED的空文件夹 如图所示 3 打开keil3依次点击Project New uVision Project 如图所示 4 找到最开始新建的文件夹TEST 并打开里
  • 学计算机编程配置需求,编程对电脑配置要求高吗?

    算法是编程的灵魂 是程序的核心组成 系统对程序算法的编译就是程序生成的过程 大型的应用程序如我们日常用的OFFICE办公工具 大家爱玩的吃鸡游戏等 其算法复杂 没有几年的苦心研发 编写代码 优化算法结构是看不出来了 由于这类程序的复杂性与庞
  • 二叉树知识点概

    树 一 树读常考性质 节点数 总度数 1 即除了根节点 每个节点都有一个入度 前驱 度为m的树和m叉树 度为m的树第i层至多有 m i 1
  • vscode中嵌入cppcheck进行静态检查,包含插件使用方法

    1 vscode下载插件cpp check lint 如图 下载好之后按ctrl shift p打开用户设置 user setting 在设置中追加加入以下代码 cppcheck配置 cpp check lint enable true 启
  • 贵州酒店集团过405拦截

    文章目录 一 为什么返回405 二 开发者怎么解除限制 一 为什么返回405 云盾是阿里巴巴集团多年来安全技术研究积累的成果 结合阿里云云计算平台强大的数据分析能力 为中小网站提供如安全漏洞检测 网页木马检测以及面向云服务器用户提供的主机入
  • QT多平台移植经验分享及问题解析

    Qt5与Qt4对比 没有Qt4用到的qws Qt5新增了QPA系统 基于QPA使得Qt5移植到一个新平台非常简单而又具有极强的底层扩展能力 同时 C 11 也获得全面支持 使用 C 11 新特性更为方便 下面讲述将Qt5 4 1移植到目标板
  • QQ红包金额分配算法

    最近对红包金额分配感兴趣 便整理了一个较简单的分配算法 思路 主要是通过随机函数对金额随机分配 由于金额与份数不断变化 如何保证分配前等概率呢 本例是将金额等分 取得均值 但第一份取左和取右等概率 故其最大值为右份边界 代码 include
  • linux copy_from_user 头文件,宋宝华: Linux为什么一定要copy_from_user ?

    网上很多人提问为什么一定要copy from user 也有人解答 比如百度一下 但是这里面很多的解答没有回答到点子上 不能真正回答这个问题 我决定写篇文章正式回答一下这个问题 消除读者的各种疑虑 这个问题 我认为需要从2个层面回答 第一个
  • MySQL5.7忘记root密码-最简单的修改密码方法

    我的上一篇博客 MySQL5 7忘记root密码 手动修改密码教程 讲的还算详细 对于Windows10 DOS命令下的修改MySQL数据库密码可能出现的一些问题都做了讲解 相比上一篇 这一片会简单化描述 1 停止MySQL服务 去任务管理
  • 性能测试LoadRunner深入浅出

    Da01 一 初步概念 1 功能测试 测试软件产品的功能是否达到要求 如 ATM取款 在线取款 是否成功 转账成功 表示功能实现了 一个人 2 性能测试 测试软件产品的性能是否达到要求 包括 时间性能 多用户共同使用时的性能 如 ATM取款
  • 作业:递归实现插入排序和在o(nlgn)时间复杂度内寻找和为定值的两个元素

    1 递归实现插入排序 基本思想 可以把插入排序看作递归 地排序A 1 n 1 然后插入a n 到已经排好序的序列a 1 n 1 中 一下是实现算法 C 描述 VS205中调试通过 class InsertSort static void M