iOS开发-冒泡、插入、选择、快速排序及二分查找

最近在准备面试,发现今年的面试大多都有笔试题,而且还是带有排序的笔试题,对于我们身处基层的开发人员来说,算法可望而不可及,但是、为了工作,为了生活,也得重新复习一下算法。总结如下:

直接新建一份demo,替换.m文件即可
.m文件代码

//
//  ViewController.m
//  排序
//
//  Created by  zengchunjun on 17/3/3.
//  Copyright © 2017年  zengchunjun. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
// 测试数据
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@8, @5, @9, @2, @5, @7, nil];
    
    NSMutableArray *bubbArray = [self BubbleSortOC:array];
//    NSLog(@"%@",bubbArray);
    
    NSMutableArray *insertArray = [self InsertSortOC:array];
//    NSLog(@"%@",insertArray);
    
    NSMutableArray *selectArray = [self SelectionSortOC:array];
//    NSLog(@"%@",selectArray);
    
    NSMutableArray *quickArray = [self QuickSorkOC:array Count:array.count];
//    NSLog(@"%@",quickArray);
    
    NSInteger binary = [self BinarySearch:@[@"2",@"5",@"6",@"8",@"9"] target:@"9"];
    NSLog(@"%ld",binary);
}
#pragma mark - 冒泡排序
/**
 
 1. 首先将所有待排序的数字放入工作列表中。
 
 2. 从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
 
 3. 重复2号步骤(倒数的数字加1。例如:第一次到倒数第二个数字,第二次到倒数第三个数字,依此类推...),直至再也不能交换。
 
 平均时间复杂度:O(n^2)
 
 平均空间复杂度:O(1)
 
 */
- (NSMutableArray *)BubbleSortOC:(NSArray *)array
{
    
    id temp;
    
    int i, j;
    
    NSMutableArray *arr = [NSMutableArray arrayWithArray:array];
    
    for (i=0; i < [arr count] - 1; ++i) {
        
        for (j=0; j < [arr count] - i - 1; ++j) {
            
            if (arr[j] > arr[j+1]) {    // 升序排列
                
                temp = arr[j];
                
                arr[j] = arr[j+1];
                
                arr[j+1] = temp;
                
            }
            
        }
        
    }
    
    return arr;
}

#pragma mark - 插入排序
/**
 
 1. 从第一个元素开始,认为该元素已经是排好序的。
 
 2. 取下一个元素,在已经排好序的元素序列中从后向前扫描。
 
 3. 如果已经排好序的序列中元素大于新元素,则将该元素往右移动一个位置。
 
 4. 重复步骤3,直到已排好序的元素小于或等于新元素。
 
 5. 在当前位置插入新元素。
 
 6. 重复步骤2。
 
 
 
 平均时间复杂度:O(n^2)
 
 平均空间复杂度:O(1)
 
 */
- (NSMutableArray *)InsertSortOC:(NSArray *)array
{
    
    id temp;
    
    int i, j;
    
    
    
    NSMutableArray *arr = [NSMutableArray arrayWithArray:array];
    
    for (i=1; i < [arr count]; ++i) {
        
        temp = arr[i];
        
        for (j=i; j > 0 && temp < arr[j-1]; --j) {
            
            arr[j] = arr[j-1];
            
        }
        
        arr[j] = temp;      // j是循环结束后的值
        
    }
    
    
    
    return arr;
}

#pragma mark - 选择排序
/**
 
 1. 设数组内存放了n个待排数字,数组下标从1开始,到n结束。
 
 2. i=1
 
 3. 从数组的第i个元素开始到第n个元素,寻找最小的元素。(具体过程为:先设arr[i]为最小,逐一比较,若遇到比之小的则交换)
 
 4. 将上一步找到的最小元素和第i位元素交换。
 
 5. 如果i=n-1算法结束,否则回到第3步
 
 
 
 平均时间复杂度:O(n^2)
 
 平均空间复杂度:O(1)
 
 */
- (NSMutableArray *)SelectionSortOC:(NSArray *)array
{
    
    id temp;
    
    int min, i, j;
    
    NSMutableArray *arr = [NSMutableArray arrayWithArray:array];
    
    for (i=0; i < [arr count]; ++i) {
        
        min = i;
        
        for (j = i+1; j < [arr count]; ++j) {
            
            if (arr[min] > arr[j]) {
                
                min = j;
                
            }
            
        }
        
        if (min != i) {
            
            temp = arr[min];
            
            arr[min] = arr[i];
            
            arr[i] = temp;
            
        }
        
    }
    
    
    
    return arr;
}

#pragma mark - 快速排序
/**
 
 1. 从数列中挑出一个元素,称为 "基准"(pivot),
 
 2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。
 
 3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
 
 递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
 
 
 
 平均时间复杂度:O(n^2)
 
 平均空间复杂度:O(nlogn)       O(nlogn)~O(n^2)
 
 */

- (NSMutableArray *)QuickSorkOC:(NSMutableArray *)array Count:(NSInteger)count
{
    
    NSInteger i = 0;
    
    NSInteger j = count - 1;
    
    id pt = array[0];
    
    
    
    if (count > 1) {
        
        while (i < j) {
            
            for (; j > i; --j) {
                
                if (array[j] < pt) {
                    
                    array[i++] = array[j];
                    
                    break;
                    
                }
                
            }
            
            for (; i < j; ++i) {
                
                if (array[i] > pt) {
                    
                    array[j--] = array[i];
                    
                    break;
                    
                }
                
            }
            
            array[i] = pt;
            
            [self QuickSorkOC:array Count:i];
            
            [self QuickSorkOC:array Count:count - i - 1];
            
        }
        
    }
    
    return array;
}

#pragma mark - 二分查找法
/**
 *  当数据量很大适宜采用该方法。
 
 采用二分法查找时,数据需是排好序的。
 
 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
 
 */
- (NSInteger)BinarySearch:(NSArray *)array target:(id)key
{
    
    NSInteger left = 0;
    
    NSInteger right = [array count] - 1;
    
    NSInteger middle = [array count] / 2;
    
    
    
    while (right >= left) {
        
        middle = (right + left) / 2;
        
        
        
        if (array[middle] == key) {
            
            return middle;
            
        }
        
        if (array[middle] > key) {
            
            right = middle - 1;
            
        }
        
        else if (array[middle] < key) {
            
            left = middle + 1;
            
        }
        
    }
    
    return -1;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279

推荐阅读更多精彩内容