82、iOS 基本算法
“冒泡排序、选择排序、快速排序、归并排序、逆序、二分查找、求两个整数的最大公约数和最小公倍数。”
一、冒泡排序
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3.针对所有的元素重复以上的步骤,除了最后一个。
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
/**
冒泡排序
*/
-(void)bubbleSortWithMutableArray:(NSMutableArray*)mutableArray{
for (int i=0; i<mutableArray.count; i++) {
for (int j=0; j<mutableArray.count-1-i;j++) {
if ([mutableArray[j] integerValue]>[mutableArray[j+1]integerValue]) {
NSString *temp = mutableArray[j];
mutableArray[j] = mutableArray[j+1];
mutableArray[j+1] = temp;
}
}
}
NSLog(@"冒泡排序结果:%@",mutableArray);
}
选择排序
从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完
算法实现
/**
选择顺序
排序的目标数组
*/
-(void)selectionSortWithMutableArray:(NSMutableArray*)mutableArray{
for (int i=0; i<mutableArray.count; i++) {
int index = i;
for (int j= i+1; j<mutableArray.count; j++) {
if ([mutableArray[index] integerValue] > [mutableArray[j] integerValue]) {
index = j;
}
}
if (index != i) {
NSString *temp = mutableArray[i];
mutableArray[i] = mutableArray[index];
mutableArray[index] = temp;
}
NSLog(@"选择mutableArray是多少:%@",mutableArray);
}
NSLog(@"选择排序结果:%@",mutableArray);
}
快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序 ,整个排序过程可以递归进行,以此达到整个数据变成有序序列
/**
快速排序
mutableArray 排序的数组
leftIndex 左边索引
rightIndex 右边索引
*/
-(void)quickSortWithMutableArray:(NSMutableArray*)mutableArray leftIndex:(NSInteger)leftIndex rightIndex:(NSInteger)rightIndex{
if (leftIndex >= rightIndex) {
return;
}
NSInteger i = leftIndex;
NSInteger j = rightIndex;
// 记录比较基准数
NSInteger key = [mutableArray[i] integerValue];
while (i<j) {
// 先从右边j开始查找比基准数小的值
// 如果比基准数大,继续查找
while (i<j && [mutableArray[j] integerValue] >= key) {
j--;
}
// 如果比基准数小,则将查找到的小值调换到i的位置
mutableArray[i] = mutableArray[j];
// 当在右边查找到一个比基准数小的值时,就从i开始往后找比基准数大的值
// 如果比基准数小,继续查找
while (i<j && [mutableArray[i] integerValue] <= key) {
i++;
}
// 如果比基准数大,则将查找到的大值调换到j的位置
mutableArray[j] = mutableArray[i];
}
// 一轮遍历完成后就能确认基准数的位置,调整到正确的位置
mutableArray[i] = @(key);
// 排序后,从基准数位置将数据分为两部分,递归运算
[self quickSortWithMutableArray:mutableArray leftIndex:leftIndex rightIndex:i-1];
[self quickSortWithMutableArray:mutableArray leftIndex:i+1 rightIndex:rightIndex];
}
逆序
就是将一串数列前后颠倒排序。
这个在iOS中直接有API,直接调用reverseObjectEnumerator就好了,十分方便。
如果不用系统自带的,也可以自己创建一个可变数组,从后往前取目标数组的值就好了。
//逆序
/**
逆序排列
参数要为可变数组
*/
-(void)reverseSortWithMutableArray:(NSMutableArray*)mutableArray{
NSArray *reversedArray = [[mutableArray reverseObjectEnumerator] allObjects];
NSLog(@"倒序排序结果:%@",reversedArray);
}
二分法查找
假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找的前提是:数组必须是有序的。
/**
二分法查找
orderArray 遍历的数组对象 (要求数组是有序的)
target 目标值
返回目标值在数组中的 index,如果没有返回 -1
*/
- (NSUInteger)binarySearchWithArray:(NSArray *)orderArray target:(NSInteger)target
{
if (!orderArray.count) {
return -1;
}
NSUInteger low = 0;
NSUInteger high = orderArray.count - 1;
while (low<=high) {
NSUInteger mid = low + (high-low)/2;
NSInteger num = [[orderArray objectAtIndex:mid] integerValue];
if (target == num) {
return mid;
}
else if(num > target){
high = mid -1;
}
else{
low = mid +1;
}
}
return -1;
}
最大公约数和最小公倍数
/**
最大公约数
@param num1 整数1
@param num2 整数2
@return 返回两个整数的最大公约数
*/
- (NSInteger)gcdWithNumber1:(NSInteger)num1 Number2:(NSInteger)num2{
while(num1 != num2){
if(num1 > num2){
num1 = num1-num2;
} else {
num2 = num2-num1;
}
}
return num1;
}
/**
最小公倍数
@param num1 整数1
@param num2 整数2
@return 返回两个整数的最小公倍数
*/
- (NSInteger)lcmWithNumber1:(NSInteger)num1 Number2:(NSInteger)num2{
NSInteger gcd = [self gcdWithNumber1:num1 Number2:num2];
// 最小公倍数 = 两整数的乘积 ÷ 最大公约数
return num1 * num2 / gcd;
}
82、iOS 基本算法的更多相关文章
- ios Swift 算法
// Playground - noun: a place where people can play import Cocoa var nums = Int[]() ... { nums.appen ...
- iOS常用算法
1.冒泡排序 冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素,如果一个元素比另一个元素大/小,那么就交换这两个元素的位置.重复一直比较到最后一个元素. 1.最差时间复杂度:O( ...
- iOS 排序算法总结、二分法查找
1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插 ...
- iOS -- DES算法
算法步骤: DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8.16.24.32.40.48.56.64位是校验位, 使得每个密钥都有奇数个1),其 ...
- iOS常见算法(二分法 冒泡 选择 快排)
二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number) { int start = 0; int end = l ...
- iOS常见算法笔试问题
1. 给出一个由小写字母组成的字符串,把所有连续出现的 2 个 a 替换成 bb ( 2 个 b ),但是对于超过两个连续的 a,那么这些字符都不作替换.例如: bad -> bad (一个a, ...
- IOS 排序算法
/** * @brief 冒泡排序法 * * @param arr 需要排序的数组 */ -(void)BubbleSort:(NSMutableArray *)arr { // 取第一个与其邻接的对 ...
- ios九宫格算法
- (void)viewDidLoad { [super viewDidLoad]; //1.总列数(一行最多3列) ; CGFloat appW=; CGFloat appH=; //2.间隙=(控 ...
- IOS 九宫格算法
@interface ViewController () @property (nonatomic,strong) NSArray *apps; //获取.plist数据 @end @implemen ...
随机推荐
- zookeeper选举流程
如何在zookeeper集群中选举出一个leader,zookeeper使用了三种算法,具体使用哪种算法,在配置文件中是可以配置的,对应的配置项是”electionAlg”,其中1对应的是Leader ...
- 编译安装redis4.0
下载redis4.0的安装包:http://download.redis.io/releases/redis-4.0.11.tar.gz 这里用的是已经下载到电脑上,只需上传即可 解压缩 [root@ ...
- flex布局-css
1.html <div id="parent"> <div id="child1"></div> <div id=& ...
- 源码解析之HashMap源码
关于HashMap的源码分析,网上已经有很多写的非常好的文章了,虽然多是基于java1.8版本以下的.Java1.8版本的HashMap源码做了些改进,理解起来更复杂点,但也不脱离其桶+链表或树的重心 ...
- eos dapp开发
https://blog.csdn.net/u010665359/article/details/82906497
- TS和C#的差异
1. TS中let a : () => void; 假设有个class B, B里有个方法 c; 不能像C#委托一样, a = B.c;...........如果这样的话方法c里调用的thi ...
- 开源虚拟化KVM(三)管理虚拟网络
六,管理虚拟网络 [x] Linux网桥基本概念 [x] qemu-kvm支持的网络 [x] 向虚拟机添加虚拟网络连接 [x] 基于NAT的虚拟网络 [x] 基于网桥的虚拟网络 [x] 用户自定义的隔 ...
- day 09
内存管理 引用计数:垃圾回收机制的依据 当变量的值被引用的时,变量值的引用计数+1,当变量名被解除绑定时该值的引用计数减少一. 当引用计数变成0的时候会被垃圾回收机制回收. 引用计数会出现循环引用问题 ...
- flask 需要下载的包
Flask 需要下载的包1.pip install flask2.pip install flask-script3.pip install flask-sqlalchemy4.pip install ...
- 大数据入门到精通19--mysql 数据导入到hive数据中
一.正常按照数据库和表导入 \\前面介绍了通过底层文件得形式导入到hive的表中,或者直接导入到hdfs中,\\现在介绍通过hive的database和table命令来从上层操作.sqoop impo ...