宽容他人,放过自己。

快速排序

Posted on By anchoriteFili

//
//  main.m
//  快速排序_练习
//
//  Created by AnchoriteFiliGod on 15/7/7.
//  Copyright (c) 2015年 赵宏亚. All rights reserved.
//

#import <Foundation/Foundation.h>

#pragma mark 快速排序_在main函数外边,直接创建函数方法
void sort(int a[],int left,int right)
{
    if (left >= right) { //如果左边的索引大于右边的索引代表已经整理完成一个组了,直接返回。
        return;
    }
    
    int i = left;
    int j = right;
    int key = a[left];
    
    while (i < j) { //控制在当组内寻找一遍
        while (i < j && key <= a[j]) {
            // 而寻找约束条件是
            // 1.找到一个小于或者大于key的数(大于或者小于取决于你想升序还是降序)
            // 2.如果没有符合条件1的,并且i与j的大小没有反转
            j --; // 向前寻找
        }
        
        /**
         找到一个这样的数后就把它赋给前面的被拿走的i的值(如果是第一次循环且key是a[left],那么就是
         给key)
         */
        a[i] = a[j];
        
        while (i < j && key >= a[i]) {
            /**
             这是i在当前组内向前寻找,同上不过注意与key的大小关系停止循环和上面相反,
             因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反
             */
            i ++;
        }
        a[j] = a[i];
    }
    
    a[i] = key; // 当在本组内找完一遍以后就把中间数key回归
    sort(a, left, i - 1); // 最后用同样的方式对分出来的左边的小组进行同上的做法
    sort(a, i + 1, right); // 用同样的方式对分出来的右边的小组进行同上的做法
                           // 当然最后可能会出现很多分左右,知道每一组的i = j为止
}

#pragma mark 在主函数内部直接调用方法即可
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        int a[10] = {0};
        for (int i = 0; i < 9; i ++) {
            a[i] = arc4random() % (100 - 50 + 1) + 50;
        }
        
        sort(a, 0, 10);
        for (int i = 0; i < 9; i ++) {
            NSLog(@"%d",a[i]);
        }
    }
    return 0;
}