排序

demo截图

--------------------------ViewController.m--------------------------

#import "ViewController.h"

#import "NSString+Compare.h"
#import "NSNumber+Compare.h"

@interface ViewController ()

@property (nonatomic, strong) NSArray *arr;
@property (nonatomic, strong) NSMutableArray *mutArr;
@property (nonatomic, strong) NSArray *strArr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.arr = @[@3, @6, @0, @9, @1];
    self.mutArr = [NSMutableArray arrayWithObjects:@3, @6, @0, @9, @1, nil];
    self.strArr = [NSArray arrayWithObjects:@"Dr", @"Rfgh", @"A", @"Vjkk", @"B", nil];
    
//    [self maopao1];
//    [self maopao2];
//    [self maopao3];
//    [self maopao4];
//    [self maopao5];
//    [self maopao6];
//    [self maopao7];
    
    /*
    [self quickStart:0 end:(int)self.mutArr.count - 1];
    NSLog(@"mutArr = %@", self.mutArr);
    */
    
//    [self insert];
//    [self shell];
//    [self descriptors];
//    [self selector];
    [self comparator];
}

#pragma mark --------------- 冒泡排序 ---------------------

// 从最前面的两个元素开始比较
- (void)maopao1
{
    for (int i = 0; i < self.mutArr.count - 1; i++)
    {
        for (int j = 0; j < self.mutArr.count - 1 - i; j++)
        {
            if (self.mutArr[j] > self.mutArr[j+1])
            {
                /*
                id temp = self.mutArr[j];
                self.mutArr[j] = self.mutArr[j+1];
                self.mutArr[j+1] = temp;
                */
                
                // 交换两个对应下标的值
                [self.mutArr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
            }
        }
    }
    NSLog(@"mutArr = %@", self.mutArr);
}
// 从最后的两个元素开始比较
- (void)maopao2
{
    for (int i = 0; i < self.mutArr.count - 1; i++)
    {
        for (int j = (int)self.mutArr.count - 1; j > i; j--)
        {
            if (self.mutArr[j] > self.mutArr[j-1])
            {
                [self.mutArr exchangeObjectAtIndex:j withObjectAtIndex:j-1];
            }
        }
    }
    NSLog(@"mutArr = %@", self.mutArr);
}
// 第一个元素依次和后面的元素比较(从前往后)
- (void)maopao3
{
    for (int i = 0; i < self.mutArr.count - 1; i++)
    {
        for (int j = i + 1; j < self.mutArr.count; j++)
        {
            if (self.mutArr[i] > self.mutArr[j])
            {
                [self.mutArr exchangeObjectAtIndex:i withObjectAtIndex:j];
            }
        }
    }
    NSLog(@"mutArr = %@", self.mutArr);
}
// 第一个元素依次和后面的元素比较(从后往前)
- (void)maopao4
{
    for (int i = 0; i < self.mutArr.count - 1; i++)
    {
        for (int j = (int)self.mutArr.count - 1; j > i; j--)
        {
            if (self.mutArr[i] > self.mutArr[j])
            {
                [self.mutArr exchangeObjectAtIndex:i withObjectAtIndex:j];
            }
        }
    }
    NSLog(@"mutArr = %@", self.mutArr);
}
// 优化,用一个标志位来避免不必要的循环,已经有序的话就不用继续循环了
- (void)maopao5
{
    for (int i = 0; i < self.mutArr.count - 1; i++)
    {
        BOOL flag = NO;
        for (int j = 0; j < self.mutArr.count - 1 - i; j++)
        {
            if (self.mutArr[j] > self.mutArr[j+1])
            {
                // 交换两个对应下标的值
                [self.mutArr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
                flag = YES;
            }
        }
        // 上一个循环比较结束而没有发生交换,但是每两个相邻元素都比较过了,说明已经有序
        if (!flag)
        {
            // 跳出循环
            break;
        }
    }
    NSLog(@"mutArr = %@", self.mutArr);
}
// 优化,省下许多无用的交换
- (void)maopao6
{
    for (int i = 0; i < self.mutArr.count - 1; i++)
    {
        int min = i;
        for (int j = i + 1; j < self.mutArr.count; j++)
        {
            if (self.mutArr[min] > self.mutArr[j])
            {
                // min总是指向最小元素
                min = j;
            }
        }
        // 当min不等于i时才交换值,否则self.mutArr[i]即为最小
        if (i != min)
        {
            [self.mutArr exchangeObjectAtIndex:i withObjectAtIndex:min];
        }
    }
    NSLog(@"mutArr = %@", self.mutArr);
}
// 优化,记录下每趟比较交换值的位置,该位置之后都是有序的,以后就不用比较了
- (void)maopao7
{
    int exchange = (int)self.mutArr.count - 1;
    while (exchange)
    {
        // 记录下发生数据交换的位置
        int bound = exchange;
        // 设置初始值
        exchange = 0;
        for (int i = 0; i < bound; i++)
        {
            if (self.mutArr[i] > self.mutArr[i+1])
            {
                [self.mutArr exchangeObjectAtIndex:i withObjectAtIndex:i+1];
                
                exchange = i;
            }
        }
    }
    NSLog(@"mutArr = %@", self.mutArr);
}

#pragma mark --------------------- 快速法 -----------------------

// 用到两个参数:数组起始元素下标i,要排序数组结束元素下标j。首先选一个数组元素(一般为中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。
- (void)quickStart:(int)i end:(int)j
{
    int m = i;
    int n = j;
    NSNumber *k = self.mutArr[(i+j)/2];
    do
    {
        while (self.mutArr[m] < k && m < j)
        {
            m++;
        }
        while (self.mutArr[n] > k && n > i)
        {
            n--;
        }
        if (m <= n)
        {
            [self.mutArr exchangeObjectAtIndex:m withObjectAtIndex:n];
            m++;
            n--;
        }
    } while (m <= n);
    
    if (m < j)
    {
        [self quickStart:m end:j];
    }
    if (n > i)
    {
        [self quickStart:i end:n];
    }
}

#pragma mark --------------------- 插入法 -----------------------

- (void)insert
{
    NSNumber *temp;
    int i, j;
    // 从第二个元素开始插入
    for (i = 1; i < self.mutArr.count; i++)
    {
        // temp为要插入的元素
        temp = self.mutArr[i];
        j = i - 1;
        while (j >= 0 && temp > self.mutArr[j])
        {
            // 数组元素向后移
            self.mutArr[j+1] = self.mutArr[j];
            j--;
        }
        // 插入
        self.mutArr[j+1] = temp;
    }
    NSLog(@"mutArr = %@", self.mutArr);
}

#pragma mark --------------------- shell法 -----------------------

// 首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序
- (void)shell
{
    NSNumber *temp;
    int i,j;
    int k = (int)self.mutArr.count / 2;
    while (k >= 1)
    {
        for (i = k; i < self.mutArr.count; i++)
        {
            temp = self.mutArr[i];
            j = i - k;
            while (j >= 0 && temp < self.mutArr[j])
            {
                self.mutArr[j+k] = self.mutArr[j];
                j-=k;
            }
            self.mutArr[j+k] = temp;
        }
        // k = k / 2
        k/=2;
    }
    NSLog(@"mutArr = %@", self.mutArr);
}

#pragma mark --------------- UsingDescriptors -----------------

- (void)descriptors
{
    /*
     NSSortDescriptor(排序描述)
     它由以下参数组成:
     键:对于一个给定的集合,对应值的键位将对集合中的每个对象进行排序;
     升序:指定一个集合是否按照升序(YES)还是降序(NO)进行排序的布尔值.
     */
     // @"self":这里代表的是可以直接进行排序,如果对一个类的属性进行排序,那么我们就直接@"属性名"即可,后边YES代表的是升序,NO代表的是降序
     NSSortDescriptor *arraySortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
     
     // sortedArrayUsingDescriptors:方法的返回值是NSArray
     NSArray *sortedArr = [self.arr sortedArrayUsingDescriptors:[NSArray arrayWithObjects:arraySortDescriptor, nil]];
     NSLog(@"sortedArr = %@", sortedArr);
     
     // sortUsingDescriptors:方法是对自身进行排序操作,返回值为空
     [self.mutArr sortUsingDescriptors:[NSArray arrayWithObjects:arraySortDescriptor, nil]];
     NSLog(@"mutArr = %@", self.mutArr);
}

#pragma mark ---------------- UsingSelector -------------------

- (void)selector
{
    /*
    // compare:默认是指一个升序的排序
    // sortedArrayUsingSelector:方法的返回值是NSArray
    NSArray *sortedArr = [self.arr sortedArrayUsingSelector:@selector(compare:)];
    NSLog(@"sortedArr = %@", sortedArr);
    
    // sortUsingSelector:方法是对自身进行排序操作,返回值为空
    [self.mutArr sortUsingSelector:@selector(compare:)];
    NSLog(@"mutArr = %@", self.mutArr);
    */
    
    // 方法选择器里的方法也可以自定义
    // 对于可变数组,如果数组元素是字符串,则数组调用sortUsingSelector:方法,对其自身进行排序操作
    NSArray *strArr = [self.strArr sortedArrayUsingSelector:@selector(compareByString:)];
    NSLog(@"strArr = %@", strArr);
    
    NSArray *numArr = [self.arr sortedArrayUsingSelector:@selector(compareByNum:)];
    NSLog(@"numArr = %@", numArr);
    
    [self.mutArr sortUsingSelector:@selector(compareByNum:)];
    NSLog(@"mutArr = %@", self.mutArr);
}

#pragma mark ---------------- UsingComparator -----------------

- (void)comparator
{
    // 对不可变数组也是用这个方法
    NSArray *sortedArr = [self.arr sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2)
    {
        if (obj1 > obj2)
        {
            return NSOrderedDescending;
        }
        else
        {
            return NSOrderedAscending;
        }
    }];
    NSLog(@"sortedArr = %@", sortedArr);
     
    
    // 如果数组元素是字符串
    NSArray *sortedStrArr = [self.strArr sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2)
    {
        // 交换obj1和obj2的位置可以改变升降序
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
    NSLog(@"sortedStrArr = %@", sortedStrArr);
}

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

--------------------------NSString+Compare.h--------------------------

#import <Foundation/Foundation.h>

@interface NSString (Compare)

- (NSComparisonResult) compareByString:(NSString *)str;

@end

--------------------------NSString+Compare.m--------------------------

#import "NSString+Compare.h"

@implementation NSString (Compare)

- (NSComparisonResult) compareByString:(NSString *)str
{
    // compare 默认是升序排序,但是如果想要降序那么加 - (负号)
    return [self compare:str];
//    return -[self compare:str];
}

@end

--------------------------NSNumber+Compare.h--------------------------

#import <Foundation/Foundation.h>

@interface NSNumber (Compare)

- (NSComparisonResult) compareByNum:(NSNumber *)num;

@end

--------------------------NSNumber+Compare.m--------------------------

#import "NSNumber+Compare.h"

@implementation NSNumber (Compare)

// 降序
- (NSComparisonResult) compareByNum:(NSNumber *)num
{
    if(self > num)
    {
        return NSOrderedAscending;
    }
    else if(self < num)
    {
        return NSOrderedDescending;
    }
    return NSOrderedSame;
}

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

推荐阅读更多精彩内容

  • 一、数组排序 简单排序(sortedArrayUsingSelector:)如果只是对字符串的排序,可以利用sor...
    奋斗的蜗牛阅读 2,144评论 0 2
  • 排序规则描述类: NSSortDescriptor NSSortDescriptor来指定排序规则, 对集合等进行...
    SkyMing一C阅读 6,550评论 3 12
  • 1.使用NSSortDescriptor对象进行数组排序 //创建一个数组NSArray *array = @[@...
    toobai阅读 2,792评论 0 1
  • 又到了开学的日子,女儿开学后要去高中部上课,从地铁口出来要走20多分钟,于是女儿决定骑共享单车,鉴于之前...
    桂花树下阅读 189评论 0 0
  • 这只暴烈的二手猫 是我从伯父家的玻璃钢架下救活过来的 当时它正嗥叫于丧母之痛 这个出生还不到三个月的小家伙 眼睛还...
    隔着玻璃亲嘴阅读 175评论 4 4