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

一、冒泡排序

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. stylus含有的特性

    Stylus 冒号可有可无 分号可有可无 逗号可有可无 括号可有可无 变量 插值(Interpolation) 混合(Mixin) 数学计算 强制类型转换 动态引入 条件表达式 迭代 嵌套选择器 父级 ...

  2. linux命令行下xlsx转换成pdf或csv的笔记

    使用libreoffice(可以用yum直接安装,占用了4xxM磁盘空间...) 然后命令行执行: 转换成csv,支持utf-8中文编码: libreoffice  --invisible --con ...

  3. Oracle :多表更新多个字段

    https://blog.csdn.net/funnyfu0101/article/details/52765235 总体原则:1)更新的时候一定要加where条件,否则必然引起该字段的所有记录更新 ...

  4. 前端笔记-javaScript-3

    BOM对象 window对象 所有浏览器都支持 window 对象概念上讲.一个html文档对应一个window对象功能上讲: 控制浏览器窗口的使用上讲: window对象不需要创建对象,直接使用即可 ...

  5. unittest框架(惨不忍睹低配版)

    根据我上个随笔的unittest框架优化得来,虽然对于smtp模块还是有点迷糊,不过还是勉强搭建运行成功了,还是先上代码: #login_test.py import requests class L ...

  6. python中的函数和变量

    本节内容 函数的定义方法 函数功能 函数的返回值 函数的形参与实参 全局变量与局部变量 递归 函数的作用域 匿名函数lambda 函数式编程 常用内置函数 其他内置函数 函数 函数的定义方法 函数就相 ...

  7. ucos中需要注意的全局变量

    首先聊一聊全局变量: 在慕课上学习浙大老师的C语言课程的时候,翁恺老师一直在强调在程序中我们要避免使用全局变量,C语言的程序员(尤其像我这样的野生程序员)为了方便,经常会不顾这个编码规范.全局变量有一 ...

  8. python异常捕捉以及处理

    看标题觉得高大上,好像能处理所有的异常.但是,事实是只能按照字面的意思来理解这一段话. 众所周知写代码哪有不出bug的? 那么出现了bug 我们不想让程序因为bug的存在而退出.那么要怎么做呢? 今天 ...

  9. Debian 9 Stretch国内常用镜像源

     随着Debian 9的普及,但由于伟大的墙的存在,那就有必要整理一下国内的镜像站点. 1.使用说明 一般情况下,修改/etc/apt/sources.list文件,将Debian的默认源地址改成新的 ...

  10. 20175314 实验二 Java面向对象程序设计

    20175314 实验二 Java面向对象程序设计 一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 二 ...