美文网首页
三种初级排序

三种初级排序

作者: 码农在途 | 来源:发表于2018-12-16 14:50 被阅读0次

三种初级排序 冒泡排序 选择排序 插入排序

思维导图

此篇文章中展示的代码为 C 语言代码 ,数组索引操作替换为指针操作。

排序算法可以分为两类 : 一种为原地排序,除了函数调用所需要的栈和固定数目的示例之外无需额外的内存的。另一类为其他排序方法,即非原地排序。

思考 :原地排序在实际应用中的效果 。

通常数据在数据库中的存储除分类外是按照时间顺序生成的 ,例如一个商城系统的订单数据首先是按照订单生成的时间出现在数据库中的,当按照订单金额排序时 ,下单的时间也是一个很重要的参考数据 ,如果在排序时改变了其先后顺序 ,一方面做了无必要的内存消耗 ,另一方面改变了原始数据的排列 ,在下一次进行其他项目( 例如 :某用户所有订单按照金额和时间排序 )就要做更多的内存消耗。

排序的实质

满序度 ,对于任意 N( 正整数 )个数排列的可能性有 n*(n-1)/2 种情况
有序度 ,即数据中顺序正确的排列组合数
无序度 ,即无序的排列组合数
公式 :无序度 = 满序度 - 有序度
对于任意排序 ,其实质就是将其无序排序变成有序排列的过程 ,即增加数据的有序度 、减少无序度 ,当无序度为 0 时排序完成 。
重点 :当数据排序操作的次数越接近无序度时 , 说明该算法更好。

冒泡排序

定义 : 比较相邻两个数字的大小,满足条件时位置不变,不满足条件时交换其位置。
属性 :原地排序,大小一致时数据位置不发生改变。在数组中 ,冒泡排序最好时间复杂度为 O(n) , 最坏时间复杂度为 O(n²) ,平均时间复杂度为 O(n)

void bubbleSort(int *nums,int n)
{
    for (int i = 0; i < n-1; i++)
    {
        int flag = 0;
        for (int j = 0; j < n - 1-i;j++)
        {
//冒泡排序法 比较相邻的两个数如果满足条件(例如 : 大的在前,小的在后)则位置不变,不满足则交换二者的位置
            if (*(nums + j) > *(nums + j + 1))
            {
                int temp =*(nums+j+1);
                *(nums+j+1)= *(nums+j);
                *(nums + j ) = temp;
                flag = 1;
            }
        }
        if (flag == 0)//当flag为 0 则说明未交换,则剩下的都是有序数列不用再循环
            break;

    }
}

选择排序

定义 :每次选择( 最大或最小 )的数字放在末尾。
属性 :非原地排序,每次按顺序从后面插入。在数组中 ,选择排序最好时间复杂度为 O(n²) , 最坏时间复杂度为 O(n²) ,平均时间复杂度为 O(n²)

void chooseSort(int *nums, int n)
{
    /*选择排序从头开始每次选择一个数为『 最大数 』
    ( 或最小数 )然后在剩下的数据中查找是否有大于(或小于它)的数
    如果有则交换两者的位置,没有则进行下一次排序*/

    for (int i = 0; i < n-1; i++)
    {
        for (int j = i+1; j < n; j++)
        {
            if (*(nums + i) > *(nums + j))
            {
                int temp = *(nums + i);
                *(nums + i) = *(nums + j);
                *(nums + j) = temp;
            }
        }
    }
}

插入排序

定义 :将数据分成有序和无序两部分,将无序部分数据插入至有序数据中按顺序排列的位置,重复该过程直到无序部分数据为空。( 也满足了分治法的思想 )
属性 :非原地排序 ,按大小插入到尾部 , 改变了数据原始的顺序 ,进行了额外的数据操作。在数组中 ,插入排序的最好时间复杂度为 O(n) ,最坏时间复杂度为 O(n²) ,平均时间复杂度为 O(n)

void insertSort(int *nums, int n)
{
    //int *temps = (int *)malloc(sizeof(int )*n);
    /*
    把数据分成两个部分一部分是有序的另一部分是无序的,
    每次把无序数列中的第一个数插入到有序数列中按顺序排列的位置
    */
    int j=0, i=0;
    for (; i < n-1; i++)
    {
        int value = *(nums + i+1);
        for ( j = i; j>=0; )
        {
            if (*(nums + j) > value)
            {
                *(nums + j + 1) = *(nums + j);
                j--;
            }
            else
                break;
        }
        *(nums + j+1) = value;
    }
}

思考在链表中三种排序时间复杂度有何变化

如果是交换链表中结点的值 ,三种算法的复杂度无变化 。

如果改变的是链表中结点的位置

冒泡排序复杂度不变 ,但因为链表结点位置交换的操作更为复杂 ,所以对性能的消耗更大。

选择排序复杂度不变 ,因为交换次数最多所以性能消耗更大。

插入排序插入数据时 ,数组数据后移操作变简单 ,相对来说性能消耗变小。

综合来看 ,插入排序在三种初级排序算法中有一定优势( 在链表等数据结构中算法的时间复杂度有优化 ,而其他两种的算法复杂度无优化 ) ,所以在实际使用中插入排序更为常用。

相关文章

  • 三种初级排序

    三种初级排序 冒泡排序 选择排序 插入排序 此篇文章中展示的代码为 C 语言代码 ,数组索引操作替换为指针操作。 ...

  • 算法_排序_三种初级排序

    数据结构和算法动态可视化 :https://visualgo.net/zh有问题1062290728@qq.com...

  • 算法——初级排序算法

    最近,在通过《算法4》这本书来重新学习一下算法,从最初级的排序算法。初级的排序算法有3种:选择排序、插入排序、希尔...

  • 第十三节-线性排序

    这节课主要讲了三种线性排序方式:桶排序、计数排序、基数排序。这三种排序都是最好情况下时间复杂度 O(n) 的算法,...

  • 排序算法-swift实现

    1.冒泡排序 时间复杂度:O(n^2) 1.1初级 1.2正宗冒泡排序 1.3冒泡排序优化 问题:排序过程中,如果...

  • Python 数据处理(十一)—— 排序

    11 排序 pandas 支持三种排序方式: 按索引排序 按指定列的值排序 按索引和列排序 11.1 按索引排序 ...

  • 第七章 微生物组数据的探索性分析.2

    Redundancy Analysis (RDA):与三种基本排序方法相对应,vegan包有三种版本的约束排序:冗...

  • 数据结构与算法--排序-O(nlogn)

    总结: 归并排序, 快速排序 时间复杂度 O(nlogn). 冒泡排序、插入排序、选择排序这三种排序算法,它们的时...

  • 排序总结:小哼买书

    之前讲了三种常用的经典排序。排序算法还有很多,例如选择排序、计数排序、基数排序、插入排序、归并排序和堆排序等等。堆...

  • 算法学习之简单排序

    简单排序 简单排序有三种, 冒泡排序,选择排序,插入排序 冒泡排序 冒泡排序是一种易于实现的排序算法, 以升序为例...

网友评论

      本文标题:三种初级排序

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