LeetCode学习_day1:原地算法
原地算法:是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部份覆盖掉。
范例:冒泡排序、选择排序、插入排序、希尔排序
(1)冒泡排序:
冒泡排序算法的原理如下:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
冒泡排序OC代码如下:
for (int i = ; i<result.count; i++) {
for (int j = ; j<result.count--i; j++) {
NSInteger left = [result[j] integerValue];
NSInteger right = [result[j+] integerValue];
if (left<right) {
[result exchangeObjectAtIndex:j withObjectAtIndex:j+];
}
}
}
NSLog(@"%@",result);
(2)选择排序--不稳定排序
选择排序算法的原理如下:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[..n],有序区为空。
②第1趟排序
在无序区R[..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[]交换,使R[..]和R[..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[..i-]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区
选择排序的OC代码如下:
NSMutableArray *sortArray = [NSMutableArray arrayWithObjects:@"", @"", @"", @"", nil];
for (NSInteger i = ; i < sortArray.count; i++) {
NSInteger k = i;
for (NSInteger j = i + ; j < sortArray.count; j++) {
//这一步我做错了,我的初始条件是 j = i, 没有考虑到,第一个元素 跟第二个元素对比就可以了,没有必要每次都第一个跟第一个开始对比
NSInteger jValue = [sortArray[j] integerValue];
NSInteger kValue = [sortArray[k] integerValue];
if (jValue < kValue) {
k = j;
}
}
[sortArray exchangeObjectAtIndex:i withObjectAtIndex:k];
}
NSLog(@"--%@---", sortArray);
(3)插入排序--稳定排序
插入排序算法的原理:
算法设计有很多方法。插入排序使用的是增量(incremental)方法;在排好子数组A[..j-]后,将A[j]插入,形成排好序的子数组A[..j];
步骤
⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;
⒉处理第i个元素时(i=,,…,n),数列{a1,a2,…,ai-}是已有序的,而数列{ai,ai+,…,an}是无序的。用ai与ai-,a i-,…,a1进行比较,找出合适的位置将ai插入;
⒊重复第二步,共进行n-i次插入处理,数列全部有序。
思路
假定这个数组的序是排好的,然后从头往后,如果有数比当前外层元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[…k]是局部有序的,保证了插入过程的正确性.
插入排序算法的OC代码如下:
NSMutableArray *sortArray = [NSMutableArray arrayWithObjects:@"", @"", @"", @"", @"", @"", nil];
for (NSInteger i = ; i < sortArray.count; i++) {
//从第一个开始跟第0个比较,所以 i= 1
if (sortArray.count <) {
break;
}
for (NSInteger j = i; j > ; j--) {
NSInteger rightV = [sortArray[j] integerValue];
NSInteger leftV = [sortArray[j - ] integerValue];
if (rightV < leftV) {
[sortArray exchangeObjectAtIndex:j withObjectAtIndex:j -];
}else {
break;
}
}
}
NSLog(@"--%@---", sortArray);
LeetCode学习_day1:原地算法的更多相关文章
- 【LeetCode】删除排序数组中的重复项&&移除特定元素【双指针,原地算法】
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1 ...
- LeetCode | 289. 生命游戏(原地算法/位运算)
记录dalao的位运算骚操作 根据百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细 ...
- OpenCV学习(16) 细化算法(4)
本章我们学习Rosenfeld细化算法,参考资料:http://yunpan.cn/QGRjHbkLBzCrn 在开始学习算法之前,我们先看下连通分量,以及4连通性,8连通性的概念: http://w ...
- OpenCV学习(15) 细化算法(3)
本章我们学习一下Hilditch算法的基本原理,从网上找资料的时候,竟然发现两个有很大差别的算法描述,而且都叫Hilditch算法.不知道那一个才是正宗的,两个算法实现的效果接近,第一种算 ...
- Leetcode学习笔记(3)
题目1 ID88 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量 ...
- 在Object-C中学习数据结构与算法之排序算法
笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...
- 集成学习值Adaboost算法原理和代码小结(转载)
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...
- TensorFlow入门学习(让机器/算法帮助我们作出选择)
catalogue . 个人理解 . 基本使用 . MNIST(multiclass classification)入门 . 深入MNIST . 卷积神经网络:CIFAR- 数据集分类 . 单词的向量 ...
- 深度学习 目标检测算法 SSD 论文简介
深度学习 目标检测算法 SSD 论文简介 一.论文简介: ECCV-2016 Paper:https://arxiv.org/pdf/1512.02325v5.pdf Slides:http://w ...
随机推荐
- Oracle Merge Into 使用注意事项
我们操作数据库的时候,有时候会遇到insertOrUpdate这种需求.如果数据库中存在数据就update,如果不存在就insert.Orcale数据库都提供了 MERGE INTO 方法来处理这种 ...
- 初学树型dp
树型DP DFS的回溯是树形DP的重点以及核心,当回溯结束后,root的子树已经被遍历完并处理完了.这便是树形DP的最重要的特点 自己认为应该注意的点 好多人都说在更新当前节点时,它的儿子结点都给更新 ...
- Vue.js面试整理
Vue项目结构介绍 build 文件夹:用于存放 webpack 相关配置和脚本. config 文件夹:主要存放配置文件,比如配置开发环境的端口号.开启热加载或开启gzip压缩等. dist 文件夹 ...
- C++ string push_back()
函数功能: 在后面添加一项 vector头文件的push_back函数,在vector类中作用为在vector尾部加入一个数据.string中的push_back函数,作用是字符串之后插入一个字符. ...
- Java中怎么合理的使用redis?
redis 支撑许多言语的客户端.在官方网站上有支撑的一切的 [redis 客户端列表]. 因为往常运用 java 作为开发言语,所以这儿描绘一下怎样通过 java 来联接和操作 redis 服务器. ...
- 【day05】php
一.时间日期函数库 1.安装:时间日期函数库PHPCORE组成部分 2. (1)date_default_timezone_set(string $timezone) 设置时区 ...
- rest-framework框架——版本
一.DRF版本控制介绍 随着项目更新,版本会越来越多,不能新的版本出现,旧版本就不再使用维护了.因此不同的版本会有不同的处理,且接口会返回不同的信息. API版本控制允许我们在不同的客户端之间更改行为 ...
- SVG开发注意事项
SVG Scalable Vector Graphics 可缩放的矢量图形 起源 在 2003 年一月,SVG 1.1 被确立为 W3C 标准,在过去很长一段时间,网页注重文字和图片的展示, SVG就 ...
- 数据仓库006 - MySQL 5.6.x - Linux最佳生产环境离线部署
一.离线安装包 文件准备 这里以mysql-5.6.23-linux-glibc2.5-x86_64.tar.gz为例,记一次MySQL 5.6.x 的生产环境离线部署过程.使用SecureCRT连接 ...
- Git修改和配置用户名和邮箱
git在push/push to时需要使用到user.name和user.email,切记一定要现配置好查看user.name/user.email git config user.name git ...