千家信息网

常见的初级排序算法有哪些

发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,本篇内容主要讲解"常见的初级排序算法有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"常见的初级排序算法有哪些"吧!前言相信所有的程序员刚开始接触到的算
千家信息网最后更新 2026年11月04日常见的初级排序算法有哪些

本篇内容主要讲解"常见的初级排序算法有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"常见的初级排序算法有哪些"吧!

前言

相信所有的程序员刚开始接触到的算法都会是排序算法,因为排序在对数据处理和计算有这重要的地位,排序算法往往是其他算法的基础;本文我们就先从初级排序算法开始学习算法。

排序算法的模板

在开始之前我们先定义一个排序算法通用的模板,在后面的排序算法都会实现这个模板

public interface SortTemplate {      void sort(Comparable[] array);      default void print(Comparable[] array) {         for (Comparable a : array) {             System.out.print(a + " ");         }     }      default boolean less(Comparable a, Comparable b) {         return a.compareTo(b) < 0;     }      default void exch(Comparable[] array, int i, int j) {         Comparable tmp = array[i];         array[i] = array[j];         array[j] = tmp;     }      }
  • Comparable: 为了让我们实现的排序算法更加的通用,可以排序任意的对象,所以我们这里使用了Comparable数组

  • sort: 不同的排序算法实现的方式不一样,子类自己去实现

  • less: 定义的公用方法,如果a < b就返回true

  • exch: 定义的公用方法,交换数组中的两个对象

  • print: 打印出数据中的每个元素

选择排序

算法实现的思路:

  • 首先找到数组中的最小元素,

  • 其实将它和数组中的第一个元素进行交换,这样就排定了一个元素;

  • 再次找出剩余元素中最小的元素与数组中的第二个元素进行交换,如此反复直到所有元素都是有序的

代码实现:

public class SelectionSort implements SortTemplate {      @Override     public void sort(Comparable[] array) {         int length = array.length;         for (int i = 0; i < length; i++) {             int min = i;             for (int j = i + 1; j < length; j++) {                 if (less(array[j], array[min])) {                     min = j;                 }             }             exch(array, i, min);         }     }  }

假如输入的数组是有序的,我们会发现选择排序运行的时候和未排序的时间一样长!

对于N个元素的数组,使用「选择排序的时间复杂度是O(n2)」

选择排序的是「数据移动最少」的,交换的次数与数组的大小是线性关系,N个元素的数组需要N次交换

冒泡排序

算法实现的思路:

比较相邻的两个元素,如果前一个比后一个大,那么就交换两个元素的位置

对每一组相邻的元素执行同样的操作,直到最后一个元素,操作完成之后就可以排定一个最大的元素

如此往复,直到数组中所有的元素都有序

代码实现:

public class BubbleSort implements SortTemplate {      @Override     public void sort(Comparable[] array) {         int length = array.length - 1;         for (int i = 0; i < length; i++) {             for (int j = 0; j < length - i; j++) {                 if (less(array[j + 1], array[j])) {                     exch(array, j, j + 1);                 }             }         }     }  }

对于N个元素的数组,使用「冒泡排序的时间复杂度是O(n2)」

插入排序

想象我们在玩扑克牌时,整理扑克牌都是把每一张插入到左边已经排好序的牌中适当的位置。插入排序的思路类似

算法实现的思路:

  • 初始默认第一个元素就是有序的,当前索引的位置从0开始

  • 先后移动当前索引的位置,当前索引位置左边的元素是有序的,从后往前开始扫码与当前索引位置元素进行比较

  • 当确定当前索引位置上的元素在左边有序适合的位置之后,插入到该位置上

  • 如果当确定当前索引位置上的元素大于了已排序的最后一个元素,那么当前索引位置直接往后移动

  • 如此反复,直到所有元素有序

代码实现:

public class InsertionSort implements SortTemplate {      @Override     public void sort(Comparable[] array) {         int length = array.length;         for (int i = 1; i < length; i++) {             for (int j = i; j > 0 && less(array[j], array[j - 1]); j--) {                 exch(array, j, j - 1);             }         }     }  }

从代码的实现我们可以看出,当遇到了当前索引的元素大于了左边有序数组的最后一个元素时,内层循环就直接结束了,所以所我们排序的数组中存在着部分有序,那么插入排序算法会很快。

考虑最糟糕的情况,如果输入数组是一个倒置的,那么插入排序的效率和选择排序一样,「时间复杂度是O(n2)」

希尔排序

对于大规模的乱序数组插入排序很慢,是因为它只交换相邻的元素,元素只能一点一点的从数组中移动到正确的位置;插入排序对于部分有序的数组排序是的效率很高;

希尔排序基于这两个特点对插入排序进行了改进;

算法实现的思路

  • 首先设置一个步长h用来分隔出子数组

  • 用插入排序将h个子数组独立排序

  • 减小h步长继续排序子数组,直到h步长为1

  • 当步长为1时就成了普通的插入排序,这样数组一定是有序的

希尔排序高效的原因,在排序之初,各个子数组都很短,子数组排序之后都是部分有序的,这两种情况都很适合插入排序。

代码实现:

public class ShellSort implements SortTemplate {      @Override     public void sort(Comparable[] array) {         int gap = 1;         int length = array.length;          while (gap < length / 3) {             gap = 3 * gap + 1;         }          while (gap >= 1) {             for (int i = gap; i < length; i++) {                 for (int j = i; j >= gap && less(array[j], array[j - gap]); j -= gap) {                     exch(array, j, j - gap);                 }             }             gap = gap / 3;         }     }  }

到此,相信大家对"常见的初级排序算法有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

排序 元素 数组 算法 有序 位置 索引 代码 思路 选择 两个 时间 步长 移动 常见 数据 方法 模板 部分 希尔 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技 西安纸贵互联网科技有限公司 互联网科技公司税收优惠 互联网科技有限公司图片 科技与互联网发展 互联网科技作文 互联网科技的英文 富国互联网科技创新基金 深圳市运趣互联网科技有限公司 玖二柒互联网科技公司待遇 剑昆互联网络科技有限公司临桂 团飞科技与伯堂互联网服务平台 崇明区互联网教育科技售后服务 开一家科技互联网公司需要多少钱 银川新华互联网科技学校联系电话 高科技互联网发展前景如何 互联网风格科技公司名称 萌小萌互联网科技河南有限公司 互联网界的黑科技 银川新华互联网科技学校是国营吗 济南华为互联网科技产业总部基地 欧洲十大科技互联网公司 科技互联网大厂 哈尔滨屹滨互联网科技有限公司 互联网科技资金流入 中国科技和美国互联网 互联网科技博主张洲 保山浩联互联网科技有限公司 安徽九吞吴互联网科技有限公司 如何强化互联网金融科技
0