网上搜罗了一些资料,整理了下算法的OC的实现代码,虽然平时开发中一般用不到,但是多积累一些技术知识,还是对以后发展大有裨益的
1. 冒泡排序算法(Bubble Sort)
相邻元素进行比较,按照升序或者降序,交换两个相邻元素的位置 是一种“稳定排序算法”
1.2算法步骤:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.3 动图演示
1.4 什么时候最快
当输入的数据已经是正序时。
1.5 什么时候最慢
当输入的数据是反序时。
1.6 冒泡排序代码示例
- (void)bubbleSortWithArray:(NSMutableArray *)array {
for (int i = 0; i < array.count - 1; i++) {
//外层for循环控制循环次数
for (int j = 0; j < array.count - 1 - i; j++) {
//内层for循环控制交换次数
if ([array[j] integerValue] > [array[j + 1] integerValue]) {
[array exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
}
}
}
NSLog(@"%@",array);
}
[self bubbleSortWithArray:[@[@"1",@"7",@"3",@"5"] mutableCopy]];
2. 快速排序算法(quick sort)
快速排序(Quick Sort) 的基本思想是:
通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
排序思路:
数组选第一个数,把比数小的放到数的左边,比数大的放到右边,结束后对左右两边的数组作重复处理即可。
快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
2.2 算法步骤
从数列中挑出一个元素,称为 “基准”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
2.3 动图演示
2.4 快速排序代码示例
- (void)quickSortArray:(NSMutableArray *)array withLeftIndex:(NSInteger)leftIndex andRightIndex:(NSInteger)rightIndex
{
if (leftIndex >= rightIndex) {//如果数组长度为0或1时返回
return ;
}
NSInteger i = leftIndex;
NSInteger j = rightIndex;
//记录比较基准数
NSInteger key = [array[i] integerValue];
while (i < j) {
/**** 首先从右边j开始查找比基准数小的值 ***/
while (i < j && [array[j] integerValue] >= key) {//如果比基准数大,继续查找
j--;
}
//如果比基准数小,则将查找到的小值调换到i的位置
array[i] = array[j];
/**** 当在右边查找到一个比基准数小的值时,就从i开始往后找比基准数大的值 ***/
while (i < j && [array[i] integerValue] <= key) {//如果比基准数小,继续查找
i++;
}
//如果比基准数大,则将查找到的大值调换到j的位置
array[j] = array[i];
}
//将基准数放到正确位置
array[i] = @(key);
/**** 递归排序 ***/
//排序基准数左边的
[self quickSortArray:array withLeftIndex:leftIndex andRightIndex:i - 1];
//排序基准数右边的
[self quickSortArray:array withLeftIndex:i + 1 andRightIndex:rightIndex];
}
NSMutableArray * arr = @[@16,@1,@2,@9,@7,@12,@5,@3,@8,@13,@10].mutableCopy;
[self quickSortArray:arr withLeftIndex:0 andRightIndex:arr.count-1];
NSLog(@"%@",array);
二叉树的遍历
1、前序遍历: 规则是若二叉树为空,则空操作返回,否则先访问根节点,在前序遍历左子树,再前序遍历右子树。 (输出、左重新递归、右重新递归)
2、中序遍历: 规则是若树为空,则空操作返回,否则从根节点开始(注意并不是先访问哪根节点),中序遍历根节点的左子树,然后访问根节点,最后中序遍历右子树。 (左重新递归、输出、右重新递归)
3、后序遍历:规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根节点。
4、层序遍历:规则是若树为空,则空操作返回,否则从树的第一层,也就是根节点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐一访问。
算法四:二分查找算法
二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn)。
使用二分法好处:可以加快寻找的效率。
二分法的思路: 它是通过与数组的中间值进行比较的
步骤如下:
1.我们要查找的值为X
2.数组是从小到大排序的
**
1.先取出数组中间的元素
2.把中间元素和X进行比较,如果中间元素大于X,那么X就位于第一个元素,和中间元素之间。反之,如果中间元素小于X,那么X就位于中间元素和最大值之间。
3.这样进行比较之后,我们的查找范围就小了一半。
NSArray *arr = @[@1,@20,@30,@45,@50,@55,@60,@66,@70];
NSInteger x = 70,min,max,mid;
min = 0;
max = arr.count - 1;
mid = (min + max) / 2;
for (int i = 0; i < arr.count; i++){
if ([arr[mid] integerValue] == x){
NSLog(@"查找次数为--->%d次",i);
NSLog(@"寻找值位置为--->%ld",mid);
return;
}
else if ([arr[mid] integerValue] > x){
max = mid - 1;
mid = (min + max) / 2;
}
else if ([arr[mid] integerValue] < x){
min = mid + 1;
mid = (min + max) / 2;
}