一文带你读懂排序算法(一):冒泡 & 快速选择排序 & 简单插入排序算法

本文介绍了三种常见的基础排序算法——冒泡排序、简单选择排序及直接插入排序,并通过示例代码展示了其实现方式。同时对比了这三种算法的时间复杂度与空间复杂度。

点击上方「蓝字」关注我们

排序是确保数据规则有序的有效手段。日常开发里,我们常用到的是“冒泡”、“插入排序”、“选择排序”三种。

大部分情况下,后台处理大规模数据量的排序问题,都能借助数据库(Mysql或Oracle)的排序字段声明(order by ${field} desc/asc), 让数据库引擎帮忙处理数据。但是总是有一些特殊情况,比如数据聚合等操作,没法借助第三方工具来帮助实现这个排序过程,这时,基础排序算法就派上用场了。

而且,了解最基础的排序算法,也是对面试笔试有着莫大帮助的哦,尤其是应届生,排序算法一般都是开发岗位的必考题。

冒泡法

冒泡算法思想:

对于给定的n记录,从第一个开始依次对相邻的两个记录进行比较,若a[j-1] > a[j],那么两者进行交换,,进行了一轮比较后,n个记录的最大将位于第n位;接着,对前(n-1)个记录进行第二轮比较;重复该过程进行到只剩下一个为止。

代码示例

public class BubbleSort {
  public static void main(String[] args) {
    sort();
  }


  public static void sort(){
    int[] arr = {88,66,999,45,22,1,35,68,88,44,11,99,85,253,44,56};
    int temp = 0;
    for(int i=0; i<arr.length; i++){
      for(int j = 1; j<arr.length -i; j++){
        //数组最大值被交换到下标最大位置
        if (arr[j-1]>arr[j]){
          temp = arr[j-1];
          arr[j-1] = arr[j];
          arr[j] = temp;
        }
      }
    }
    for (int a=0; a<arr.length; a++){
      System.out.println("序列的第"+a+"元素是:"+arr[a]);
    }
  }
}

简单选择排序法

简单选择排序法的思想:

对于给定的一组记录,经过第一轮比较得到最小的记录,然后将该记录与第一个记录位置交换;然后(除去第一个)对其他记录进行第二轮比较,最小与第二个记录位置交换,重复过程至剩下一个。

代码示例

public class SelectionSort {
  public static void main(String[] args) {
    int[] a = {9,8,7,6,5,4,3,2,1,0};
    selectionSort(a);
  }


  public static void selectionSort(int[] arr) {
    int n = arr.length;
    for (int i = 0; i < n; i++) {
      int k = i;
      //find out the smallest one.
      for (int j = i + 1; j < n; j++) {
        if (arr[j] < arr[k]) {
          k = j;
        }
      }
      //把最小值元素跟头部元素交换
      if (k > i) {
        int temp = arr[i];
        arr[i] = arr[k];
        arr[k] = temp;
      }
    }


    for (int a=0; a<arr.length; a++){
      System.out.println("序列的第"+a+"元素是:"+arr[a]);
    }
  }
}

直接插入排序法

插入排序算法思想:

从第二个记录开始,与第一个组成子序列,比较选出最小者,插入到最前方(索引为0),此时两个元素为有序序列;然后加入第三个元素组成新的序列,根据大小将其插入到有序序列中;依次插入所有元素后,直至停止。

代码示例

public class StrightInsertion {
  public static void main(String[] args) {
    int[] arr = {12, 15, 13, 46, 55, 1, 5, 3};
    strightinsertion(arr);
  }
  public static void strightinsertion(int [] arr){
    int tmp ;
    for (int i=1; i<arr.length; i++){
      for(int j=i; j>0; j--){
        if (arr[j]<arr[j-1]){
          tmp = arr[j-1];
          arr[j-1] = arr[j];
          arr[j] = tmp;
        }
      }
    }
    for (int a=0; a<arr.length; a++){
      System.out.println("序列的第"+a+"元素是:"+arr[a]);
    }
  }
}

时间复杂度与空间复杂度

 

排序算法最好时间平均时间最坏时间辅助存储稳定性备注
冒泡Ο(n)Ο(n²)Ο(n²)Ο(1)稳定n小时较好
简单选择Ο(n²)Ο(n²)Ο(n²)Ο(1)不稳定n小时较好
直接插入Ο(n)Ο(n²)Ο(n²)Ο(1)稳定大部分有序较好

—END—

扫码添加关注货

获取更多知识干货

后台技术汇

点个“在看”表示朕

已阅

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后台技术汇

对你的帮助,是对我的最好鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值