iOS 快速排序
一.快速排序概念及其思想
快速排序(QuickSort),又称为交换排序,是分治算法的一种,快速排序采用分治的策略。
1.分治法的基本思想:
将原问题分解为若干个规模更小但结构和原问题相似的子问题。递归这些子问题,然后将这些子问题的解组合为原问题的解。
2.快速排序的基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
二.快速排序步奏解释
设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
①分解:
在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
注意:
划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注意pivot=R[pivotpos]):
R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
其中low≤pivotpos≤high。
②求解:
通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。
③组合:
因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。
简单地说:
步奏详解
1 ).设置两个变量i,j ,排序开始时i = 0,就j = mutableArray.count - 1;
2 ).设置数组的第一个值为比较基准数key,key = mutableArray.count[0];
3 ).因为设置key为数组的第一个值,所以先从数组最右边开始往前查找比key小的值。如果没有找到,j--继续往前搜索;如果找到则将mutableArray[i]和mutableArray[j]互换,并且停止往前搜索,进入第4步;
4 ).从i位置开始往后搜索比可以大的值,如果没有找到,i++继续往后搜索;如果找到则将mutableArray[i]和mutableArray[j]互换,并且停止往后搜索;
5 ).重复第3、4步,直到i == j(此时刚好执行完第三步或第四部),停止排序;
假设mutableArray = [@(4),@(3),@(7),@(1),@(5),@(8)]
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| 数据 | 4 | 3 | 7 | 1 | 5 | 8 |
第一步:i = 0; j = 5; key = 4;
第二步:要找比key小的指,从右往前找,j不断递减,直到找到第一个比key小的,然后将mutableArray[i]和mutableArray[j]互换
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| 数据 | 1 | 3 | 7 | 4 | 5 | 8 |
i = 0; j = 3; key = 4;
第三步:要找比key大的指,从左往后找,i不断递增,直到找到第一个比key大的,然后将mutableArray[i]和mutableArray[j]互换
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| 数据 | 1 | 3 | 4 | 7 | 5 | 8 |
i = 2; j = 3; key = 4;
接着j--,则i==j;这样就称为一次循环
然后将key左边,右边的值分别当做一个数组重复上面步骤
三.任何的说法都是……,上代码
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *arr = [[NSMutableArray alloc]initWithObjects:@(),@(),@(),@(),@(),@(),@(), nil];
[self quickSortArr:arr withLeftIndex: andRightIndex:arr.count -];
NSLog(@"%@",arr);
}
- (void)quickSortArr:(NSMutableArray *)array withLeftIndex:(NSInteger )leftIndex andRightIndex:(NSInteger )rightIndex{
if (leftIndex > rightIndex) {
return;
}
NSInteger i = leftIndex;
NSInteger j = rightIndex;
NSInteger key = [array[i]integerValue];
while (i < j) {
while (i < j && key <= [array[j] integerValue]) {
j --;
}
array[i] = array[j];
while (i < j && key >= [array[i] integerValue]) {
i ++;
}
array[j] = array[i];
}
array[i] = @(key);
//前面排序
[self quickSortArr:array withLeftIndex:leftIndex andRightIndex:i -];
//后面排序
[self quickSortArr:array withLeftIndex:i + andRightIndex:rightIndex];
}
时间复杂度:
其实对快排而言,最好的情况就是每次partition操作的元素正好插在整个子序列的中间,这样是最好的,因此最好效率是N*logN。最坏情况当然就是往两极插了,N方。
iOS 快速排序的更多相关文章
- IOS 快速排序法
- (NSMutableArray *)QuickSort:(NSMutableArray *)list StartIndex:(NSInteger)startIndex EndIndex:(NSIn ...
- iOS算法笔记-快速排序-OC实现
快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...
- iOS可视化动态绘制八种排序过程
前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...
- iOS面试题 -总结 ,你的基础扎实吗?
1.#import和#include的区别,@class代表什么? (1)#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷 ...
- iOS 面试题搜集
1.#import和#include的区别,@class代表什么? 2.浅拷贝和深拷贝区别是什么? 3.Objective-C中类别和类扩展的区别? 4.Objective-C堆和栈的区别? 5.内存 ...
- PAT (Basic Level) Practise 1045 快速排序(离散化+主席树区间内的区间求和)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
- 李洪强iOS面试题之-iOS选择题
1.及时聊天app不会采用的网络传输方式是 DA UDP B TCP C Http D FTP 2.下列技术不属于多线程的是 AA Block B NSThread C NSOperation D G ...
- ios开发——常用经典算法OC篇&冒泡/快速
冒泡排序与快速排序 1.序言 ios开发中涉及到算法的地方还真不多,除非你的应用程序真的非常大,或者你想你的应用程序性能非常好才会去想到关于算法方面的性能优化,而在ios开发中真的能用得到的也就是关于 ...
- iOS开发——面试指导
iOS面试指导 一 经过本人最近的面试和对面试资料的一些汇总,准备记录这些面试题,以便ios开发工程师找工作复习之用,本人希望有面试经验的同学能和我同时完成这个模块,先出面试题,然后会放出答案. 1. ...
随机推荐
- 关于字符的C++函数
toupper(), tolower()不会改变原来的字符; 如果输入不是字母, 返回值跟原字符相同. isupper(), islower()..
- Javascript Engine, Java VM, Python interpreter, PyPy – a glance
提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...
- nmap 介绍
原文地址:http://drops.wooyun.org/tips/2002 原文地址:http://infotechbits.wordpress.com/2014/05/04/introductio ...
- TCP的客户端搭建
一.设计目标 之前已经写过了TCP服务器原理及通过visual studio 验证 SOCKET编程:搭建一个TCP服务器,这里我们搭建一个TCP客户端界面并对各功能进行实现.设计效果如下: 二.实验 ...
- Python之配置日志的几种方式(logging模块)
原文:https://blog.csdn.net/WZ18810463869/article/details/81147167 作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Py ...
- swarm集群日常部分操作
docker swarm: 1)查看集群使用docker info 或 docker node ls 查看集群中的相关信息 2)swarm集群中node的availability状态可以为 activ ...
- 解决expect自动登录,rz和sz不能使用问题
一.问题描述: 解决expect自动登录,rz和sz不能使用问题: 二.解决方法: 1. 临时修改环境变量: 将本地的LC_CTYPE环境变量设置成en_US export LC_CTYPE=en_U ...
- Python中用random产生随机数的用法
>>>random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 >>>random.unifo ...
- .net framework 4.5 +steeltoe+ springcloud(二) 实现服务发现与调用功能
首先,写一个简单的可被调用的服务注册到服务中心,我们这命名为java-service,用的是IDEA创建一个spring boot项目,选择spring client类型. 修改application ...
- nginx 开启gzip 压缩资源
upstream sems { server 127.0.0.1:10171 weight=1 fail_timeout=0; } server { listen 80; server_name ww ...