专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

排序方法有哪几种,八种经典排序算法介绍

来源:小易整编  作者:小易  发布时间:2022-12-10 07:45
摘要:算法和数据结构是一个程序员的内功,所以经常在一些笔试中都会要求手写一些简单的排序算法,以此考验面试者的编程水平。下面我就简单介绍八种常见的排...

排序方法有哪几种,八种经典排序算法介绍

算法和数据结构是一个程序员的内功,所以经常在一些笔试中都会要求手写一些简单的排序算法,以此考验面试者的编程水平。下面我就简单介绍八种常见的排序算法,一起学习一下。

一、冒泡排序

思路:

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;

  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素就是最大的数;

  • 排除最大的数,接着下一轮继续相同的操作,确定第二大的数...

  • 重复步骤1-3,直到排序完成。

动画演示:

实现代码:

/** * @author Ye Hongzhi 公众号:java技术爱好者 * @name BubbleSort * @date 2020-09-05 21:38 **/public class BubbleSort extends BaseSort {        public static void main(String[] args) {        BubbleSort sort = new BubbleSort();        sort.printNums();    }        @Override    protected void sort(int[] nums) {        if (nums == null || nums.length < 2) {            return;        }        for (int i = 0; i < nums.length - 1; i++) {            for (int j = 0; j < nums.length - i - 1; j++) {                if (nums[j] > nums[j + 1]) {                    int temp = nums[j];                    nums[j] = nums[j + 1];                    nums[j + 1] = temp;                }            }        }    }}//10万个数的数组,耗时:21554毫秒

平均时间复杂度:O(n²)

空间复杂度:O(1)

算法稳定性:稳定

二、插入排序

思路:

  1. 从第一个元素开始,该元素可以认为已经被排序;

  2. 取出下一个元素,在前面已排序的元素序列中,从后向前扫描;

  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

  5. 将新元素插入到该位置后;

  6. 重复步骤2~5。

动画演示:

实现代码:

/** * @author Ye Hongzhi 公众号:java技术爱好者 * @name InsertSort * @date 2020-09-05 22:34 **/public class InsertSort extends BaseSort {    public static void main(String[] args) {        BaseSort sort = new InsertSort();        sort.printNums();    }    @Override    protected void sort(int[] nums) {        if (nums == null || nums.length < 2) {            return;        }        for (int i = 0; i < nums.length - 1; i++) {            //当前值            int curr = nums[i + 1];            //上一个数的指针            int preIndex = i;            //在数组中找到一个比当前遍历的数小的第一个数            while (preIndex >= 0 && curr < nums[preIndex]) {                //把比当前遍历的数大的数字往后移动                nums[preIndex + 1] = nums[preIndex];                //需要插入的数的下标往前移动                preIndex--;            }            //插入到这个数的后面            nums[preIndex + 1] = curr;        }    }}//10万个数的数组,耗时:2051毫秒

平均时间复杂度:O(n²)

空间复杂度:O(1)

算法稳定性:稳定

三、选择排序

思路:

第一轮,找到最小的元素,和数组第一个数交换位置。

第二轮,找到第二小的元素,和数组第二个数交换位置...

直到最后一个元素,排序完成。

动画演示:

实现代码:

/** * @author Ye Hongzhi 公众号:java技术爱好者 * @name SelectSort * @date 2020-09-06 22:27 **/public class SelectSort extends BaseSort {    public static void main(String[] args) {        SelectSort sort = new SelectSort();        sort.printNums();    }    @Override    protected void sort(int[] nums) {        for (int i = 0; i < nums.length; i++) {            int minIndex = i;            for (int j = i + 1; j < nums.length; j++) {                if (nums[j] < nums[minIndex]) {                    minIndex = j;                }            }            if (minIndex != i) {                int temp = nums[i];                nums[minIndex] = temp;                nums[i] = nums[minIndex];            }        }    }}//10万个数的数组,耗时:8492毫秒

算法复杂度:O(n²)算法空间复杂度:O(1)算法稳定性:不稳定

四、希尔排序

思路:

把数组分割成若干(h)个小组(一般数组长度length/2),然后对每一个小组分别进行插入排序。每一轮分割的数组的个数逐步缩小,h/2->h/4->h/8,并且进行排序,保证有序。当h=1时,则数组排序完成。

动画演示:

实现代码:

/** * @author Ye Hongzhi 公众号:java技术爱好者 * @name SelectSort * @date 2020-09-06 22:27 **/public class ShellSort extends BaseSort {    public static void main(String[] args) {        ShellSort sort = new ShellSort();        sort.printNums();    }    @Override    protected void sort(int[] nums) {        if (nums == null || nums.length < 2) {            return;        }        int length = nums.length;        int temp;        //步长        int gap = length / 2;        while (gap > 0) {            for (int i = gap; i < length; i++) {                temp = nums[i];                int preIndex = i - gap;                while (preIndex >= 0 && nums[preIndex] > temp) {                    nums[preIndex + gap] = nums[preIndex];                    preIndex -= gap;                }                nums[preIndex + gap] = temp;            }            gap /= 2;        }    }}//10万个数的数组,耗时:261毫秒

算法复杂度:O(nlog2n)算法空间复杂度:O(1)算法稳定性:稳定


本文地址:网络知识频道 https://www.hkm168.com/jiqiao/868867.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


网络知识
小编:小易整编
相关文章相关阅读
  • php怎么实现对字符串的排序

    php怎么实现对字符串的排序

    实现步骤:1、利用str_split()函数将字符串转为字符数组,语法“str_split(字符串)”;2、使用asort()或arsort()函数来对字符数组进行升序排序或降序排序,语法“asort(字符数组)”或“arsort(字符数组...

  • 什么是结构化程序设计

    什么是结构化程序设计

    结构化程序设计是一种使程序更加清晰、易于理解和维护的编程方法论。通过将程序划分为不同的模块,并使用控制结构来组织这些模块,结构化程序设计使程序的开发和维护更加高效和可靠,无论是初学者还是有经验的开发者,都应该掌握结构化程序设计的基本原理和技...

  • c语言程序的基本单位是什么

    c语言程序的基本单位是什么

    c语言程序的基本单位是函数,函数是c程序的基本组成单位,一个c语言程序中仅有一个main函数,除main函数之外可以有若干个其它的函数,每个函数实现某一特定的操作。推荐:《C语言教程》C语言程序是由函数构成的,函数是C程序的基本组成单位,一...

  • 什么是指令,什么是程序?

    什么是指令,什么是程序?

    指令是计算机能实现的基本操作,是指挥机器工作的指示和命令,指令均为二进制数形式;指令由操作码和地址码组成,操作码告诉计算机执行什么操作,地址码告诉计算机到哪个存储单元地址中读取参与操作的数据。而程序是若干指令或命令的集合。本教程操作环境:w...

  • 网页中最基本的元素是什么

    网页中最基本的元素是什么

    网页中最基本的元素是“文字和图像”。网页是构成网站的基本元素,是承载各种网站应用的平台;而文字与图像是构成一个网页的两个最基本的元素,文字就是网页的内容,图像就是网页的美观;除此之外,网页的元素还包括动画、音乐、视频等等。网页是构成网站的...

  • c语言运算符的优先级顺序怎么排序

    c语言运算符的优先级顺序怎么排序

    c语言运算符的优先级顺序是括号运算符>一元运算符>算术运算符>移位运算符>关系运算符>位运算符>逻辑运算符>赋值运算符>逗号运算符。理解并正确使用运算符的优先级是c语言编程的关键之一,它有助于......

  • 如何在uniapp中使用微信小程序的API接口

    如何在uniapp中使用微信小程序的API接口

    如何在uniapp中使用微信小程序的API接口随着微信小程序的流行,越来越多的开发者希望将微信小程序的功能应用到其他平台上。而uniapp作为一个跨平台开发框架,为开发者提供了一个方便的方式来实现这一目标。本文将详细介绍在uniapp中如何...

  • 怎么自学成为一个程序员

    怎么自学成为一个程序员

    众所周知程序员是21世纪比较吃香的工作。程序员工资高还不需要和复杂的社会打交道。那么作为一个零基础,什么都不懂的人该怎么成为一名程序员?当程序员需要学什么?下面就来分析下。零基础的我该如何学习?如果想做一个程序员,在没有基础的情况下,买书自...

  • 周排行
  • 月排行
  • 年排行

精彩推荐