Objective-C 算法快速、冒泡、选择

1、快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

-(void) sortQuick:(NSMutableArray *)arrary low:(NSUInteger)low high:(NSUInteger)high
{
    if(low>=high)
        return;
    NSUInteger index=[self sortUnit:arrary low:low hight:high];
    NSLog(@"index=%lu",index);
    if(index>1)
    {
     [self sortQuick:arrary low:low high:index-1];
    }
    if(index+1<high)
    {
     [self sortQuick:arrary low:index+1 high:high];
    }
}

-(NSUInteger)sortUnit:(NSMutableArray *)arrary low:(NSUInteger)low hight:(NSUInteger)high
{
    NSInteger k=[arrary[low] integerValue];
    while (low<high) {
        while ([arrary[high] integerValue]>=k&&high>low) {
            --high;
        }
        if(high!=low)
        {
          [arrary exchangeObjectAtIndex:low withObjectAtIndex:high];
        }
        NSLog(@"%@",arrary);
        while ([arrary[low] integerValue]<=k && high>low) {
            ++low;
        }
        if(high!=low)
        {
        [arrary exchangeObjectAtIndex:low withObjectAtIndex:high];
        }        
        NSLog(@"%@",arrary);
    }
    
    return high;
    
}
//
    NSMutableArray *source=[NSMutableArray array];
    for(int i=0;i<10;i++)
    {
        NSNumber *num = [NSNumber numberWithInt: arc4random()%100];
        [source addObject:num];
    }
    NSUInteger c = source.count;
    [self sortQuick:source low:0 high:c-1];

2、冒泡排序
依次比较两个相邻的元素,如果他们的顺序错误就把他们交换过来。

稳定排序、O(n^2)

 //冒泡排序: 
    NSArray *_source=@[@8,@3,@11,@9,@5,@7,@6];
    NSMutableArray *source=[NSMutableArray arrayWithArray:_source];
    NSUInteger c = source.count;
    for(int j=0;j<c;j++)
    {
        for(int i=0;i<(c-1-j);i++)//最大值在尾部,所以每一遍可以比上一次少比较一位
        {
            NSInteger m=[source[i] integerValue];
            NSInteger n=[source[i+1] integerValue];
            if(m>n)
            {
                [source exchangeObjectAtIndex:i withObjectAtIndex:i+1];
            }
            
        }
        
    }

3、选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
demo:
选择最小值放到前边,【有序+无序】;每一遍有序加一、无序减一。

-(void)selectionSort:(NSMutableArray *) ar
{
    for(int i=0;i<ar.count-1;i++)
    {
        int position=i;
        for(int j=i+1;j<ar.count;j++)
        {         
            if([ar[j] integerValue]<[ar[position] integerValue])
            {
                position=j;//position指向最小的
            }
        }
        [ar exchangeObjectAtIndex:i withObjectAtIndex:position];
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值