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

易企推科技
易企推科技

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

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

五、快速排序

快排,面试最喜欢问的排序算法。这是运用分治法的一种排序算法。

思路:

  1. 从数组中选一个数作为基准值,一般选第一个数,或者最后一个数。

  2. 采用双指针(头尾两端)遍历,从左往右找到比基准值大的第一个数,从右往左找到比基准值小的第一个数,交换两数位置,直到头尾指针相等或头指针大于尾指针,把基准值与头指针的数交换。这样一轮之后,左边的数就比基准值小,右边的数就比基准值大。

  3. 对左边的数列,重复上面1,2步骤。对右边重复1,2步骤。

  4. 左右两边数列递归结束后,排序完成。

动画演示:

实现代码:

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

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

六、归并排序

归并排序是采用分治法的典型应用,而且是一种稳定的排序方式,不过需要使用到额外的空间。

思路:

  1. 把数组不断划分成子序列,划成长度只有2或者1的子序列。

  2. 然后利用临时数组,对子序列进行排序,合并,再把临时数组的值复制回原数组。

  3. 反复操作1~2步骤,直到排序完成。

归并排序的优点在于最好情况和最坏的情况的时间复杂度都是O(nlogn),所以是比较稳定的排序方式。

动画演示:

实现代码:

/** * @author Ye Hongzhi 公众号:java技术爱好者 * @name MergeSort * @date 2020-09-08 23:30 **/public class MergeSort extends BaseSort {    public static void main(String[] args) {        MergeSort sort = new MergeSort();        sort.printNums();    }    @Override    protected void sort(int[] nums) {        if (nums == null || nums.length < 2) {            return;        }        //归并排序        mergeSort(0, nums.length - 1, nums, new int[nums.length]);    }    private void mergeSort(int star, int end, int[] nums, int[] temp) {        //递归终止条件        if (star >= end) {            return;        }        int mid = star + (end - star) / 2;        //左边进行归并排序        mergeSort(star, mid, nums, temp);        //右边进行归并排序        mergeSort(mid + 1, end, nums, temp);        //合并左右        merge(star, end, mid, nums, temp);    }    private void merge(int star, int end, int mid, int[] nums, int[] temp) {        int index = 0;        int i = star;        int j = mid + 1;        while (i <= mid && j  nums[j]) {                temp[index++] = nums[j++];            } else {                temp[index++] = nums[i++];            }        }        while (i <= mid) {            temp[index++] = nums[i++];        }        while (j = 0) System.arraycopy(temp, 0, nums, star, index);    }}//10万个数的数组,耗时:26毫秒

算法复杂度:O(nlogn)算法空间复杂度:O(n)算法稳定性:稳定

七、堆排序

大顶堆概念:每个节点的值都大于或者等于它的左右子节点的值,所以顶点的数就是最大值。

思路:

  1. 对原数组构建成大顶堆。

  2. 交换头尾值,尾指针索引减一,固定最大值。

  3. 重新构建大顶堆。

  4. 重复步骤2~3,直到最后一个元素,排序完成。

构建大顶堆的思路,可以看代码注释。

动画演示:


本文地址:网络知识频道 https://www.hkm168.com/jiqiao/868867_2.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世纪比较吃香的工作。程序员工资高还不需要和复杂的社会打交道。那么作为一个零基础,什么都不懂的人该怎么成为一名程序员?当程序员需要学什么?下面就来分析下。零基础的我该如何学习?如果想做一个程序员,在没有基础的情况下,买书自...

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

精彩推荐