排序算法(冒泡、选择、插入、快速)

一、冒泡排序

arr[j] 和 arr[j+1] 比较,如果arr[j] > arr[j+1]则交换arr[j]、arr[j+1]的值

- (void)bubbleSortArray{

    NSMutableArray *dataArr = [[NSMutableArray alloc]initWithObjects:@(2),@(1),@(6),@(4),@(3),@(5),nil];
    
    for (NSInteger i=0; i<dataArr.count-1; i++) {
        
        for (NSInteger j=0; j<dataArr.count-1-i; j++) {
            
            if ([dataArr[j] integerValue] > [dataArr[j+1] integerValue]) {
                NSNumber *temp = dataArr[j];
                dataArr[j] = dataArr[j+1];
                dataArr[j+1] = temp;
            }
        }
    }
    
    for (NSNumber *number in dataArr) {
        NSLog(@"冒泡 number = %@",number);
    }
}
2019-01-15 16:11:51.807953+0800 Demo[8960:1072997] 冒泡 number = 1
2019-01-15 16:11:51.808144+0800 Demo[8960:1072997] 冒泡 number = 2
2019-01-15 16:11:51.808298+0800 Demo[8960:1072997] 冒泡 number = 3
2019-01-15 16:11:51.808400+0800 Demo[8960:1072997] 冒泡 number = 4
2019-01-15 16:11:51.808472+0800 Demo[8960:1072997] 冒泡 number = 5
2019-01-15 16:11:51.808531+0800 Demo[8960:1072997] 冒泡 number = 6

二、选择排序

arr[i] 和 arr[j] 比较,如果arr[i] > arr[j]则交换arr[i]、arr[j]的值。而且j从j=i+1开始。

- (void)selectSortArray{

    NSMutableArray *dataArr = [[NSMutableArray alloc]initWithObjects:@(2),@(1),@(6),@(4),@(3),@(5),nil];
    
    for (NSInteger i=0; i<dataArr.count-1; i++) {
        for (NSInteger j=i+1; j<dataArr.count; j++) {
            if ([dataArr[i] integerValue] > [dataArr[j] integerValue]) {
                NSNumber *temp = dataArr[i];
                dataArr[i] = dataArr[j];
                dataArr[j] = temp;
            }
        }
    }
    for (NSNumber *number in dataArr) {
        NSLog(@"选择 number = %@",number);
    }
}
2019-01-15 16:11:51.808697+0800 Demo[8960:1072997] 选择 number = 1
2019-01-15 16:11:51.808767+0800 Demo[8960:1072997] 选择 number = 2
2019-01-15 16:11:51.808836+0800 Demo[8960:1072997] 选择 number = 3
2019-01-15 16:11:51.808910+0800 Demo[8960:1072997] 选择 number = 4
2019-01-15 16:11:51.808977+0800 Demo[8960:1072997] 选择 number = 5
2019-01-15 16:11:51.809047+0800 Demo[8960:1072997] 选择 number = 6

三、插入排序

每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

- (void)insertSortArray{

    NSMutableArray *dataArr = [[NSMutableArray alloc]initWithObjects:@(2),@(1),@(6),@(4),@(3),@(5),nil];
    
    for (NSInteger i=1; i<dataArr.count; i++) {
        for (NSInteger j=i; j>0 && ([dataArr[j] integerValue] < [dataArr[j-1] integerValue]) ; j--) {
            NSNumber *temp = dataArr[j];
            dataArr[j] = dataArr[j-1];
            dataArr[j-1] = temp;
        }
    }
    for (NSNumber *number in dataArr) {
        NSLog(@"插入排序 number = %@",number);
    }
}
2019-01-15 16:11:51.809183+0800 Demo[8960:1072997] 插入排序 number = 1
2019-01-15 16:11:51.809282+0800 Demo[8960:1072997] 插入排序 number = 2
2019-01-15 16:11:51.809422+0800 Demo[8960:1072997] 插入排序 number = 3
2019-01-15 16:11:51.809564+0800 Demo[8960:1072997] 插入排序 number = 4
2019-01-15 16:11:51.812314+0800 Demo[8960:1072997] 插入排序 number = 5
2019-01-15 16:11:51.812470+0800 Demo[8960:1072997] 插入排序 number = 6

四、快速排序

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

- (void)quickSortArray{
    
    NSMutableArray *dataArr = [[NSMutableArray alloc]initWithObjects:@(2),@(1),@(6),@(4),@(3),@(5),nil];
    
    [self quickSortWithArr:dataArr low:0 high:dataArr.count-1];
    
    for (NSNumber *number in dataArr) {
        NSLog(@"快速排序 number = %@",number);
    }
}

- (void)quickSortWithArr:(NSMutableArray *)arr low:(NSInteger)low high:(NSInteger)high{
    
    NSInteger pivotKey = 0;
    if (low < high) {
        
        pivotKey = [self partTionWithArr:arr low:low high:high];
        [self quickSortWithArr:arr low:low high:pivotKey-1];
        [self quickSortWithArr:arr low:pivotKey + 1 high:high];
    }
}

- (NSInteger)partTionWithArr:(NSMutableArray *)arr low:(NSInteger)low high:(NSInteger)high{
    
    NSInteger pivotValue = [arr[low] integerValue];
    
    while (low < high) {
        while ((low < high) && [arr[high] integerValue] >= pivotValue) {
            high--;
        }
        arr[low] = arr[high];
        while (low < high && [arr[low] integerValue] <= pivotValue) {
            low++;
        }
        arr[high] = arr[low];
    }
    
    arr[low] = @(pivotValue);
    return low;
}

2019-01-15 16:11:51.812618+0800 Demo[8960:1072997] 快速排序 number = 1
2019-01-15 16:11:51.812702+0800 Demo[8960:1072997] 快速排序 number = 2
2019-01-15 16:11:51.812782+0800 Demo[8960:1072997] 快速排序 number = 3
2019-01-15 16:11:51.812857+0800 Demo[8960:1072997] 快速排序 number = 4
2019-01-15 16:11:51.812919+0800 Demo[8960:1072997] 快速排序 number = 5
2019-01-15 16:11:51.812992+0800 Demo[8960:1072997] 快速排序 number = 6
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 排序算法说明 (1)排序的定义:对一序列对象根据某个关键字进行排序; 输入:n个数:a1,a2,a3,…,an 输...
    code武阅读 3,890评论 0 0
  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 4,910评论 0 4
  • 当我在阳台上百无聊赖的时候,你以坚韧质感的形象,用枝梢上满绽的玉色花蕾入侵我的视野。玉质兰心,我知道,你就是...
    巴根阅读 3,401评论 2 6
  • 五月,鸟语花香; 五月,爱意融融。 五月,感天动地; 五月,情洒人间。 五月,道不尽的感恩; 五月,诉不完的真情。...
    落寞在凉州的烟雨里阅读 4,274评论 9 27
  • 初次见到野胡是在《格列佛游记》里,书中的野胡暗指人类,其实是抛却了所有人类优点,只留下人类缺点的一种动物...
    我是珍熙阅读 3,325评论 0 1