常见排序算法简述

冒泡排序BubbleSort

基本思想

通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻的元素值,  
若发现逆序则交换,使值较大的元素逐渐从前往后移动,就像水底的气泡逐渐往上冒  

优化

若一趟比较下来没有进行过交换,就说明序列有序,通过设置flag判断元素是否进行过交换,减少不必要的比较

过程

  1. 一共进行 数组大小-1 次的大循环
  2. 每一趟排序的次数逐渐减少
  3. 如果发现某趟排序中,没有发生一次交换,则提前结束排序

选择排序SelectSort

基本思想

每次假定需要排序数组第一位为最小值,找到需要排序数组中最小的值及其下标,将min与数组第一位进行交换。  
即每次找到最小值放在数组最前面。总共进行n-1次

过程

  1. 选择排序一共有 数组大小-1 轮排序
  2. 每一轮排序,又是一个循环
    • 假定当前这个数为最小值
    • 然后和后面的每个数进行比较,如果发现有比当前数更小的数,就重新确定最小数,并得到下标
    • 当遍历到数组最后,就得到本轮最小数和下标
    • 交换

插入排序InsertSort

基本思想

把n个待排序的元素看成一个有序和一个无序表,开始有序表只包含一个元素,无序表中包含n-1个元素,  
排序过程中每次从无序表中取出第一个元素,把它的排序吗依次与有序表元素的排序码比较,  
将它插入到有序表中的适当位置,使之成为新的有序表

希尔排序ShellSort

基本思想

把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,  
每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法终止

在这里插入图片描述

快排排序QuickSort

基本思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分所有数据都要小,  
然后再按照此方法对这两部分数据分别进行快速排序,整个排序过程通过递归实现,依次达到整个数据变成有序序列

在这里插入图片描述

优化

  1. 基准选取可以优化为随机选取待排序的其中一个
  2. 分段可以优化为分成三段,一段比基准小,一段等于基准,一段大于基准,后续分别对小于和大于基准的进行快排即可

归并排序MergeSort

基本思想

利用归并的思想实现的排序方法,该算法采用经典的分治策略,分治法将问题分成一些小问题然后递归求解,  
而治的阶段则将分的阶段得到的各答案修补在一起,即分而治之

在这里插入图片描述

堆排序HeapSort

基本思想

  1. 将待排序序列构造成一个大顶堆
  2. 此时整个序列的最大值就是堆顶的根节点
  3. 将其与末尾元素进行交换,此时末尾就为最大值
  4. 然后将剩余n-1个元素重新构造成一个堆,就会得到n个元素的次小值。反复执行,即可得到一个有序序列

特点

  1. 利用数组模拟完全二叉树
  2. 父节点 i 的两个 子节点位置为2i+1与2i+2

基数排序RadixSort

基本思想

  1. 将所有待比较数值同一为同样的数为长度,数位较短的数前面补零。然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序数列
  2. 基数排序属于分配式排序,又称桶子法bucket sort或bin sort,顾名思义,通过键值的各个位的值,将要排序的元素分配至某些桶中,达到排序的作用
  3. 基数排序法属于稳定排序,是效率高的稳定排序法
  4. 是桶排序的扩展
  5. 将整数按位数切割成不同的数字,然后按每个位数分别比较

代码

import java.util.Arrays;

/**
 * @author ZhangXiong
 * @version v12.0.1
 * @date 2020-07-17
 */
public class Sort {
   
    public static void main(String[] args) {
   
        int n = 8000000;
        int[] arr = new int[n];
        int[] arr1 = new int[n];
        for (int i = 0; i < n; i++) {
   
            arr[i] = (int) (Math.random() * n);
            arr1[i] = arr[i];
        }
        long start = System.currentTimeMillis();
        // 测试sort
        new Sort().heapSort(arr);
        long mid = System.currentTimeMillis();
        System.out.println("mySort cost: " + (mid - start) + "ms");
        Arrays.sort(arr1);
        long end = System.currentTimeMillis();
        // 打印排序后的数组
        //System.out.println(Arrays.toString(arr));
        System.out.println("ArraysSort cost: " + (end - mid) + "ms");
        System.out.println(Arrays.equals(arr, arr1));
    }


    /**
     * 冒泡排序
     * 稳定排序
     *
     * @param arr
     */
    public void bubbleSort(int[] arr) {
   
        for (int i = arr.length - 1; i > 0; i--) {
   
            for (int j = 1; j <= i;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值