美文网首页
基本排序算法-冒泡排序、选择排序、插入排序

基本排序算法-冒泡排序、选择排序、插入排序

作者: async丶 | 来源:发表于2019-11-06 17:54 被阅读0次
1.冒泡排序

原理:冒泡排序的原理就是小的数字慢慢的往上浮。从数组最后面开始循环,如果一个数比它前面数小,则交换两者位置。

以下是冒泡排序OC语言完整实现:

/*冒泡排序*/
+ (void)startSortWithDataArray{
    NSArray *array = @[@8,@3,@5,@10,@1,@6,@4,@2,@7,@9];
    NSMutableArray *arr = [array mutableCopy];

    //交换次数
    NSInteger exchangeCount = 0;
    //比较次数
    NSInteger checkCount = 0;
    //标记有没有发生交换,如果没有发生则表示数组已经有序,退出排序
    BOOL haveChange = false;

    for (NSInteger i = 0; i < arr.count; i++) {
        haveChange = false;
        for (NSInteger j = 0; j < arr.count - 1 - i; j++) {

            if ([arr[j] integerValue] > [arr[j+1] integerValue]) {
                [arr exchangeObjectAtIndex:j withObjectAtIndex:j+1];
                exchangeCount++;
                haveChange = true;
            }
            checkCount++;
            if (j == arr.count - 2 - i) {
                if (!haveChange) {
                    NSLog(@"----------本趟结束,且本趟没有进行交换,数组已经有序,退出排序-------\n\n");
                }
            }
        }
        if (haveChange == false) {
            break;
        }
    }

    NSLog(@"排序后:%@",arr);
    NSLog(@"本次排序结束,一共比较%ld次,共进行%ld次交换",checkCount,exchangeCount);
}

时间复杂度:O(N²)   
1.平均情况下:冒泡比较的次数约是插入排序的两倍,移动次数一致。
2.平均情况下:冒泡与选择排序的比较此时是一样的,移动比选择排序多出n次

稳定性:稳定

示意图: 冒泡排序
2.选择排序

原理:选择排序的原理很简单,就是从需要排序的数据中选择最小的(从小到大排序),然后放在第一个,选择第二小的放在第二个。

以下是选择排序OC语言完整实现:

/*选择排序*/
+ (void)startSortWithDataArray{
    NSArray *array = @[@8,@3,@5,@10,@1,@6,@4,@2,@7,@9];
    NSMutableArray *arr = [array mutableCopy];

    //交换次数
    NSInteger exchangeCount = 0;
    //比较次数
    NSInteger checkCount = 0;

    for (NSInteger i = 0 ; i < arr.count; i++) {
        NSInteger minIndex = i;
        for (NSInteger j = i+1; j < array.count; j++) {
            checkCount++;
            if ([arr[j]integerValue] < [arr[minIndex]integerValue]) {
                 minIndex = j;
            }
        }
        if (minIndex != i) {
            [arr exchangeObjectAtIndex:i withObjectAtIndex:minIndex];
            exchangeCount++;
        }
    }

    NSLog(@"排序后:%@",arr);
    NSLog(@"本次排序结束,一共比较%ld次,共进行%ld次交换",checkCount,exchangeCount);
}

时间复杂度:O(N²)   稳定性:不稳定
运行时间与输入无关。因为前一次的扫描并不能为后面的提供信息。
数据的移动次数是最小的。

示意图: 选择排序
3.插入排序

原理:如果数组进行循环得到a,若a比a前面的一个数小,则a就与前面数交换位置(相当于a向前面移动一位),若移动后a任然比前面一个数小,则再向前移动一位。

以下是插入排序OC语言完整实现:

/*插入排序*/
+ (void)startSortWithDataArray{
    NSArray *array = @[@8,@3,@5,@10,@1,@6,@4,@2,@7,@9];
    NSMutableArray *arr = [array mutableCopy];

    //比较次数
    NSInteger checkCount = 0;
    //交换次数
    NSInteger exchangeCount = 0;

    for (NSInteger i = 1; i < .count; i++) {
        for (NSInteger j = i; j > 0 ; j--) {
            checkCount++;
            if ([arr[j]integerValue] < [arr[j-1]integerValue]) {
                [arr exchangeObjectAtIndex:j withObjectAtIndex:j-1];
                exchangeCount++;
            }else{
                NSLog(@"本次不交换,本趟排序结束\n");
                break;
            }
        }
    }
    NSLog(@"排序后:%@",arr);
    NSLog(@"插入排序结束,一共比较%ld次,共进行%ld次交换",checkCount,exchangeCount);
}
     

时间复杂度:O(N²)   稳定性:稳定
若数据倒置的数量很少时,速度快

示意图: 插入排序

图片出处:https://www.cnblogs.com/xiaohuiduan/p/11188304.html

相关文章

  • 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

    图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

  • 排序

    常见排序算法 冒泡排序 插入排序 选择排序 快速排序 归并排序 堆排序 桶排序 对数器 冒泡排序 基本思想:元素两...

  • 基本的排序算法

    基本的排序算法有 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 各种排序的复杂度 冒泡排序 ...

  • 排序一:冒泡、插入、选择

    文章结构 概述 冒泡排序 插入排序 选择排序 1. 概述 常见的排序算法有:冒泡排序、插入排序、选择排序、归并排序...

  • 算法

    1.常用的八个基本排序算法 -前言:希尔排序和直接插入排序属于插入排序算法,简单选择排序和堆排序属于选择排序,冒泡...

  • 排序算法

    排序算法 排序是最基本的算法之一,常见的排序算法有插入排序、希尔排序、选择排序、冒泡排序、堆排序、归并排序及快速排...

  • noip普及组3:排序算法

    排序算法 ①冒泡排序:O() ②插入排序:O() ③选择排序:O() ④桶排序 ⑤sort排序

  • 前端基础整理 | 算法基础

    排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序

  • 排序算法

    排序算法 冒泡排序 选择排序 插入排序 快速排序(最常见) 希尔排序 归并排序 源码:Sorting 冒泡排序 冒...

  • 排序题

    公共函数 选择排序 冒泡排序 插入排序 快速排序 归并排序——迭代算法

网友评论

      本文标题:基本排序算法-冒泡排序、选择排序、插入排序

      本文链接:https://www.haomeiwen.com/subject/tmxpbctx.html