快速排序应用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
快速排序又是一种分而治之思惟在排序算废喔赡典范应用。本质上来看,快速排序应当算是在冒泡排序基本上的递归分治法。
快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,并且效力高!它是处理大年夜数据最快的排序算法之一了。
1.算法步调
1. 大年夜数列中挑出一个元素,称为 “基准”(pivot);
2. 从新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大年夜的摆在基准的后面(雷同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中心地位。这个称为分区(partition)操作;
3. 递归地(recursive)把小于基准值袈洫素的子数列和大年夜于基准值袈洫素的子数列排序;
快速排序的优化可推敲当分区距离小的的时刻转而应用插入排序
2.代码实现
2. 把堆首(最大年夜值)和堆尾交换;
- #pragma mark - /**快速排序*/
- - (void)mb_quickSort{
- //要特别留意界线的情况
- [self mb_quickSort:self indexL:0 indexR:(int)self.count - 1];
- }
- - (void)mb_quickSort:(NSMutableArray *)array indexL:(int)l indexR:(int)r{
- if (l >= r) return;
- int p = [self __partition:array indexL:l indexR:r];
- [self mb_quickSort:array indexL:l indexR:p-1];
- [self mb_quickSort:array indexL:p + 1 indexR:r];
- }
- /**
- 对arr[l...r]部分进行partition操作
- 返回p, 使得arr[l...p-1] < arr[p] ; arr[p+1...r] > arr[p]
- @param array array
- @param l 左
- @param r 右
- @return 返回p
- */
- - (int)__partition:(NSMutableArray *)array indexL:(int)l indexR:(int)r{
- int j = l;// arr[l+1...j] < v ; arr[j+1...i) > v
- for (int i = l + 1; i <= r ; i++) {
- if ( self.comparator(array[i], array[ l]) == NSOrderedAscending) {
- j++;
- //交换
推荐阅读
上篇(25 个术语)如不雅你刚接触大年夜数据,你可能会认为这个范畴很难以懂得,无大年夜下手。不过,你可以大年夜下面这份包含了 25 个大年夜数据术语的清单入手,那么我们开端吧。算法(Algorithm):算法可以懂得>>>详细阅读
本文标题:在Object-C中学习排序算法
地址:http://www.17bianji.com/lsqh/36561.html
1/2 1