算法之一 : <<快速排序>>

- (void)viewDidLoad {
    [super viewDidLoad];

  
    NSMutableArray *array = [NSMutableArray arrayWithArray:@[@5,@1,@9,@3,@7,@4,@8,@6,@2]];
    
    [self quickSortWithArray:array left:0 right:array.count-1];
    
    NSLog(@"%@",array);
    
}

#pragma mark ---快速排序算法 ----
-(void)quickSortWithArray:(NSMutableArray *)dataArray left:(NSInteger)left right:(NSInteger)right{
    
    /*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
    if (left >= right) {
        return;
    }
    
    NSInteger i = left;
    NSInteger j = right;
    NSNumber * key = dataArray[left];
    
    /*控制在当组内寻找一遍*/
    while (i< j) {
        
        while (i<j && key <= dataArray[j])
        /*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
         序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
        {
            
            j--;/*向前寻找*/
            
        }
        dataArray[i] = dataArray[j];
        /*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
         a[left],那么就是给key)*/

        while(i < j && key >= dataArray[i])

        /*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
         因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
        {
            i++;
        }
        
        dataArray[j] = dataArray[i];
        
    }
    
    dataArray[i] = key;/*当在当组内找完一遍以后就把中间数key回归*/
    [self quickSortWithArray:dataArray left:left right:i-1];
    /*最后用同样的方式对分出来的左边的小组进行同上的做法*/
    [self quickSortWithArray:dataArray left:i+1 right:right];
    /*用同样的方式对分出来的右边的小组进行同上的做法*/
    
    /*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容