百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

图解简单选择排序,超详细非常好理解

myzbx 2025-07-02 23:17 40 浏览

1. 基本概念

简单选择排序(Select Sort)真的是人如其名,一是它真的非常简单,二是它主要依靠选择和交换操作来进行排序。可以将简单选择排序实现为稳定的排序算法,也可以实现为不稳定的排序算法。

我们先来直观地感受一下它的主要思想,假设有一个装满了球的桶,每个球上都标有一个数字,现在我们需要对桶中的所有球按从小到大的顺序进行排序。

首先我们从桶中选择数字最小的那个球,将它取出并放在桌子上;然后再从桶中选择数字最小的那个球,并将它取出放在第一个球的后面;然后又从桶中选择数字最小的那个球,并把它放到第二个球的后面。以此类推,每次都从桶中选择数字最小的那个球,并把它取出后放到之前所有已选出的那些球的后面;那么当最后一个球被取出并放置后,所有这些球就排好序了。

我们可以发现,第一次取出的球它在最终的有序序列中的位置是第一个,第二次取出的球在最终的有序序列中的位置是第二个。同理,第i次取出的球它在最终的有序序列中的位置是第i个。

这个例子主要体现了选择的思想,但是简单选择排序还涉及另一个思想,那就是交换。在上面这个例子中,排序之前球在桶中,排序后球在桌子上,即排序前后放置的地方不同。简单选择排序是对一个序列(数组)中的元素进行排序,排序后这些元素还是在这个原始序列中,只是它们的相对位置发生了改变。我们当然可以使用一个和原序列相同大小的临时序列,每当从原序列中选出一个元素就将它放置到临时序列中,最后再将整个有序的临时序列复制回原序列。

这样的方式需要大量额外的临时存储空间,但实际上不需要临时序列也能实现简单选择排序,这就是通过交换来完成的。我们先提醒一下,在大多数编程语言中序列(数组)的第1个元素的下标为0,最后一个元素的下标为n-1(假设序列一共有n个元素)。

总的来说简单选择排序由多趟组成,第 i 趟(i的取值范围是[1, n-1])排序就是从 n-i+1 个未排序的元素中选择最小的那个元素,并将它和序列中的第 i 个元素(它的下标为i-1)交换位置。在 n-i+1 个元素中找出最小的那个是通过元素之间的两两比较完成的,一共需要 n-i 次比较。

我们首先从整个序列(下标为0 ~ n-1)中选择最小的那个元素,如果它不是第1个元素(下标为0),那么就将它和第1个元素交换位置;这样这个最小的元素就处于它最终的位置上了,而原来的第1个元素现在位于这个最小元素之前的位置上。然后再从第2 ~ n个元素(下标为1 ~ n-1)中选择最小的元素,并将它和第2个元素交换位置,这样这个第二小的元素就在它最终的位置上了。然后又从第3 ~ n个元素(下标为2 ~ n-1)中选择最小的那个元素,并将它和第3个元素交换位置,这样这个第三小的元素也在它的最终位置上了。重复这一过程,直到整个序列排好序。

在简单选择排序的过程中,我们可以将整个序列看成是前后两部分,前面部分中的元素是已经排好序了的,后面部分中的元素是还没有排好序的。每趟排序都从后面部分选出最小的元素,将它和后面部分的第1个元素交换位置,这样该元素就和之前的前面部分形成新的前面部分,它之中的所有元素都是排好序了的,而原先的后面部分中从它的第2个元素开始的所有剩余元素形成新的后面部分。图1通过一个例子展示了简单选择排序的完整过程。

一个具有n个元素的序列进行简单选择排序的时候,需要执行n-1趟而不是n趟。这是因为在第n-1趟开始时,序列中的前n-2个元素都是已排好序了的,只有最后的两个元素还没有排好序。第n-1趟就是从这两个元素中选择较小的那个元素,并将它交换到序列中倒数第二个位置上,同时最后那一个元素也被交换到了最后的位置上。此时,整个序列就排好序了,因此也就不再需要第n趟操作了。

2. 代码实现

本文中我们使用C语言来实现简单选择排序,代码非常简单直接,即便不熟悉C语言也能明白;并且在代码中我们也给出了非常详细的注释。

/*
 * Function: selectSort
 * Description: 简单选择排序的实现
 * param: array 待排序的序列(数组)
 * param: n 序列中的元素数量
 */
void selectSort(int array[], int n) {
    /*
     * i、j作为循环控制变量,temp用于交换元素,
     * minIndex用于记录每一趟中最小元素的下标。
     */
    int i;
    int j;
    int temp;
    int minIndex;

    /*
     * 外层循环,用于控制第1至第(n-1)趟排序;
     * 第i趟时,后面部分的元素的下标范围是(i-1) ~ (n-1)。
     */
    for(i = 1; i < n; i++) {
        // 将后面部分的第1个元素的下标赋予minIndex
        minIndex = i - 1;

        /*
         * 从后面部分的第二个元素开始,通过和当前最小元素
         * 进行比较而选出实际最小的那个元素,将它的下标
         * 记录在minIndex中。
         */
        for(j = i; j < n; j++) {
            if(array[j] < array[minIndex]) {
                minIndex = j;
            }
        }

        /* 
         * 如果本趟中最小的元素不是后面部分的第1个元素(下标是i-1),
         * 则需要交换元素
         */
        if(minIndex != i - 1) {
            temp = array[i - 1];
            array[i - 1] = array[minIndex];
            array[minIndex] = temp;
        }
    }
}

3. 复杂度分析

根据我们前面的讲述可知,一个具有n个元素的序列需要进行n-1趟排序,第i趟需要进行n-i次比较,因此一共需要 (n - 1) + (n - 2) + ··· + 1 = n(n - 1)/2次比较。而每一趟要么交换元素、要么不交换元素,因此最好情况下(原序列中的元素在排序前就已经是有序的了)共需0次交换,最坏情况下共需n-1次交换。因此时间复杂度为O(n^2),即n的平方。

根据我们的实现,简单选择排序只需要几个固定的额外空间用于存储变量i、j、temp和minIndex,它和原序列的长度无关。因此,简单选择排序的空间复杂度为O(1)。

(完)

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 &quot;小贱贱&quot;韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...