“冒泡排序、选择排序、快速排序、归并排序、逆序、二分查找、求两个整数的最大公约数和最小公倍数。”

一、冒泡排序

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 基本算法的更多相关文章

  1. ios Swift 算法

    // Playground - noun: a place where people can play import Cocoa var nums = Int[]() ... { nums.appen ...

  2. iOS常用算法

    1.冒泡排序 冒泡算法是一种基础的排序算法,这种算法会重复的比较数组中相邻的两个元素,如果一个元素比另一个元素大/小,那么就交换这两个元素的位置.重复一直比较到最后一个元素. 1.最差时间复杂度:O( ...

  3. iOS 排序算法总结、二分法查找

    1.插入排序 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环,直到全部排好顺序. 直接插 ...

  4. iOS -- DES算法

    算法步骤: DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8.16.24.32.40.48.56.64位是校验位, 使得每个密钥都有奇数个1),其 ...

  5. iOS常见算法(二分法 冒泡 选择 快排)

    二分法: 平均时间复杂度:O(log2n) int halfFuntion(int a[], int length, int number)  { int start = 0; int end = l ...

  6. iOS常见算法笔试问题

    1. 给出一个由小写字母组成的字符串,把所有连续出现的 2 个 a 替换成 bb ( 2 个 b ),但是对于超过两个连续的 a,那么这些字符都不作替换.例如: bad -> bad (一个a, ...

  7. IOS 排序算法

    /** * @brief 冒泡排序法 * * @param arr 需要排序的数组 */ -(void)BubbleSort:(NSMutableArray *)arr { // 取第一个与其邻接的对 ...

  8. ios九宫格算法

    - (void)viewDidLoad { [super viewDidLoad]; //1.总列数(一行最多3列) ; CGFloat appW=; CGFloat appH=; //2.间隙=(控 ...

  9. IOS 九宫格算法

    @interface ViewController () @property (nonatomic,strong) NSArray *apps; //获取.plist数据 @end @implemen ...

随机推荐

  1. lombok踩坑与思考

    虽然接触到lombok已经有很长时间,但是大量使用lombok以减少代码编写还是在新团队编写新代码维护老代码中遇到的. 我个人并不主张使用lombok,其带来的代价足以抵消其便利,但是由于团队编码风格 ...

  2. offsetWidth/offsetHeight,clientWidth/clientHeight与scrollWidth/scrollHeight的区别

    offsetWidth/offsetHeight返回值包含content + padding + border,效果与e.getBoundingClientRect()相同 clientWidth/c ...

  3. SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_*

    一个大的SQL语句操作,执行计划中包含了一个merge join操作,观察到SQL长时间处于IO_COMPLETION等待状态,如果是读取相关的表的数据,服务器应该全力为其服务,但是服务器的物理IO又 ...

  4. 《DOM Scripting》学习笔记-——第五章、第六章 案列改进

    第四章的案例代码可以得到更好的改进.例如:预留退路.向后兼容性和分离js. 原html代码: <!DOCTYPE html> <html lang="en"> ...

  5. 吴裕雄 python深度学习与实践(18)

    # coding: utf-8 import time import numpy as np import tensorflow as tf import _pickle as pickle impo ...

  6. Models中字段的参数

    (1)null 如果为True,Django 将用NULL 来在数据库中存储空值. 默认值是 False. (1)blank 如果为True,该字段允许不填.默认为False. 要注意,这与 null ...

  7. findbugs插件使用

    本文以idea的插件举例子 介绍 Findbugs是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题. idea安装 自此,插件安装完毕,需要重启idea才生 ...

  8. SpringCloud Hystrix熔断之线程池

    服务熔断 雪崩效应:是一种因服务提供者的不可用导致服务调用者的不可用,并导致服务雪崩的过程. 服务熔断:当服务提供者无法调用时,会通过断路器向调用方直接返回一个错误响应,而不是长时间的等待,避免服务雪 ...

  9. java第七章集合框架

    如果想存储多个人物信息可以使用数组实现但是采用数组存以下明显缺陷: 数组长度不变不能适应元素变化情况,若存储大于20个英雄信息则长度不够,若只存储10个则造成内存空间浪费.可用.length获取数组中 ...

  10. flutter ListView简介

    child: new Container( child: new Center( child: ListView( shrinkWrap:true, children: <Widget>[ ...