插入排序
插入排序的代码实现固然没有冒泡排序和选择排序那么简单粗暴,但它的道理应当是最轻易懂得的了,因为只要打过扑克牌的人都应当可以或许秒懂。插入排序是一种最简单直不雅的排序算法,它的工作道理是经由过程构建有序序列,对于未排序数据,在已排序序列中大年夜后向前扫描,找到响应地位并插入。
1. 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2. 大年夜头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的恰当地位。(如不雅待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
2.代码实现
- #pragma mark - /**插入排序*/
- - (void)mb_insertionSort{
- for (int i = 0; i < self.count; i++) {
- id e = self[i];
- int j;
- for (j = i; j > 0 && self.comparator(self[j - 1],e) == NSOrderedDescending; j--) {
- [self mb_exchangeWithIndexA:j indexB:j- 1];
- }
- self[j] = e;
- }
- }
归并排序
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采取分治法(Divide and Conquer)的一个异常典范的应用。
作为一种典范的分而治之思惟的算法应用,归并排序的实现由两种办法:
>1. 自上而下的递归(所有递归的办法都可以用迭代重写,所以就有了第 2 种办法)
>2. 自下而上的迭代;
本文应用的是**自顶向下**的归并排序
1.算法步调
1.算法步调
1. 申请空间,使其大年夜小为两个已经排序序列之和,该空间用来存放归并后的序列;
2. 设定两个指针,最初地位分别为两个已经排序序列的肇端地位;
3. 比较两个指针所指向的元素,选择相对小的元素放入到归并空间,并移动指针到下一地位;
4. 反复步调 3 直到某一指针达到序列尾;
5. 将另一序列剩下的所有元素直接复制到归并序列尾。
2.代码实现
多路快速排序
2. 再大年夜残剩未排序元素中持续寻找最小(大年夜)元素,然后放到已排序序列的末尾。
- ///shift_down操作
- - (void)shiftDown:(int )k{
- while (2 * k <= _count) {
- int j = 2 * k;
- if (j + 1 <= _count && [self heapCompareWithBarOne:_data[j + 1] andBarTwo:_data[j]] == NSOrderedDescending) j++;//左孩子小于右孩子
- if ([self heapCompareWithBarOne:_data[k] andBarTwo:_data[j]] == NSOrderedDescending) break;//父节点大年夜于子节点
- self.comparator(nil, nil);
- [_data mb_exchangeWithIndexA:k indexB:j];
- k = j;
推荐阅读
上篇(25 个术语)如不雅你刚接触大年夜数据,你可能会认为这个范畴很难以懂得,无大年夜下手。不过,你可以大年夜下面这份包含了 25 个大年夜数据术语的清单入手,那么我们开端吧。算法(Algorithm):算法可以懂得>>>详细阅读
本文标题:在Object-C中学习排序算法
地址:http://www.17bianji.com/lsqh/36561.html
1/2 1