资讯专栏INFORMATION COLUMN

算法Training——排序

syoya / 1434人阅读

摘要:对于不稳定的排序算法,只需要举出实例,就能证明其不稳定性。而对稳定排序算法,必须对算法进行分析才能判断其是否稳定排序算法是否稳定是由具体算法决定的,稳定算法也可以在某种条件下变为不稳定算法。

分类

排序算法主要分为两大类

比较排序,主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等

非比较排序,主要有:计数排序,基数排序,桶排序等

稳定性

排序算法的稳定性定义:
如果序列中有a=b,排序前a在b之前,排序后a还在b之前,则称这种排序算法是稳定的。

对于不稳定的排序算法,只需要举出实例,就能证明其不稳定性。而对稳定排序算法,必须对算法进行分析才能判断其是否稳定

排序算法是否稳定是由具体算法决定的,稳定算法也可以在某种条件下变为不稳定算法。例如冒泡排序中,把交换两数的条件变为A[i]>=A[i+1](原本是>号)

上例告诉我们,算法是由具体的人来写的,写的垃圾,稳定算法也能写的不稳定
常见排序算法性能表

具体排序算法分析和实例 1. 冒泡排序 介绍

重复地走访过要排序的元素,依次比较相邻两个元素,如果他们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端。

步骤

比较相邻的元素,如果前一个比后一个大,就把它们两个调换位置

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数

针对所有的元素重复以上的步骤,除了已经排序完成的数

实例 1. 描述

给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法

2. 样例

对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5]

3. 分析

无需分析

4. 解答
fun sortInteger(a : IntArray)
{
    val len = a.size - 1
    var alreadyNum =  0
    var sortFinish = false

    while (alreadyNum <= len - 1 && !sortFinish)
    {
        var perSortFinish = true

        for (i in 1..(len - alreadyNum))
        {
            if (a[i-1] > a[i])
            {
                val temp = a[i-1]
                a[i-1] = a[i]
                a[i] = temp
                perSortFinish = false
            }
        }

        sortFinish = perSortFinish
        alreadyNum += 1
    }
}
public void sortIntegers(int[] A) {
    int len = A.length - 1;
    int alreadyNum = 0;
    boolean sortFinish = false;

    while (alreadyNum <= len - 1 && !sortFinish)
    {
        boolean perSortFinish = true;

        for (int i=1; i <= len-alreadyNum; i++)
        {
            if (A[i-1] > A[i])
            {
                int temp = A[i-1];
                A[i-1] = A[i];
                A[i] = temp;
                perSortFinish = false;
            }
        }

        sortFinish = perSortFinish;
        alreadyNum += 1;
    }
}
2. 快速排序 介绍

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

步骤

先从数列中取出一个数(为方便通常会选第一个数)作为基准数

逐个比较,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边

再对左右区间重复第二步,直到各区间只有一个数

实例

直接沿用上一题的实例,为便于阅读,将该例子再写一遍

1. 描述

给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法

2. 样例

对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5]

3. 分析

无需分析

4. 解答

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69438.html

相关文章

  • 移动端开发工程师的AI突围之路

    摘要:在此期间,移动端开发工程师可谓是风生水起,几乎人们日常生活中接触互联网的途径,都是通过一个叫的东西,基于这两大系统平台。而上面说的这些事情,都是当今移动端开发者的机会。 古典程序员集体恐慌 随着2007年第一台iPhone问世,随后Android的猛烈跟进,苹果和谷歌推动了长达10年的移动互联网浪潮。在此期间,移动端开发工程师可谓是风生水起,几乎人们日常生活中接触互联网90%的途径,都...

    2bdenny 评论0 收藏0
  • 深入浅出排序学习:写给程序员的算法系统开发实践

    引言 我们正处在一个知识爆炸的时代,伴随着信息量的剧增和人工智能的蓬勃发展,互联网公司越发具有强烈的个性化、智能化信息展示的需求。而信息展示个性化的典型应用主要包括搜索列表、推荐列表、广告展示等等。 很多人不知道的是,看似简单的个性化信息展示背后,涉及大量的数据、算法以及工程架构技术,这些足以让大部分互联网公司望而却步。究其根本原因,个性化信息展示背后的技术是排序学习问题(Learning to ...

    caige 评论0 收藏0

发表评论

0条评论

syoya

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<