首页 > 编程语言 >基本排序算法总结(转)

基本排序算法总结(转)

时间:2022-12-14 17:57:11浏览次数:59  
标签:总结 right int 复杂度 算法 array 排序 left

基本排序算法总结

原文:https://blog.csdn.net/qq_21187515/article/details/127212565


一直想总结一下最常用的排序算法,自己写一下代码并运行一下记忆更深刻

1、插入排序

  1. 说明
    每步将一个待排序的记录,按其排序码大小,插到前面已经排序的文件中的适当位置,直到全部插入完为止。
    原理:从待排序的n个记录中的第二个记录开始,依次与前面的记录比较并寻找插入的位置,每次外循环结束后,将当前的数插入到合适的位置。

  2. 平均时间复杂度
    平均复杂度 O(n²)
    最好情况 O(n)
    最坏情况 O(n²)
    空间复杂度O(1);
    稳定性 稳定

  3. 适用场景
    插入排序由于O( n2 )的复杂度,在数组较大的时候不适用。它适用于简单数据排序。

  4. 代码

/**
 * 简单插入排序
 */
public class InsertSort {

    public static void insertSort(int[] arr){
        int temp;
        int length = arr.length;
        for(int i=1;i<length;i++){
            int j = i-1;
            temp = arr[i];
            while(j>=0 && arr[j] > temp){
                arr[j+1] = arr[j];
                j--;
            }
            if(j != i-1){
                arr[j+1] = temp;
            }
        }
    }
}

2、希尔排序

  1. 说明
    在希尔排序出现之前,计算机界普遍存在“排序算法不可能突破O(n2)”的观点。希尔排序是第一个突破O(n2)的排序算法,它是简单插入排序的改进版。
    希尔排序是对直接插入排序的改进算法。希尔排序是通过分组+插入,先分组再插入。

  1. 平均时间复杂度
    平均复杂度 O(nlogn)
    最好情况 O(n log²n)
    最坏情况 O(n log²n)
    空间复杂度O(1)
    稳定性 不稳定

  2. 适用场景
    Shell排序虽然快,但是毕竟是插入排序,其数量级并没有后起之秀–快速排序O(n㏒n)快。在大量数据面前,Shell排序不是一个好的算法。但是,中小型规模的数据完全可以使用它。

  3. 代码

/**
 * 快速排序
 */
public class QuickSort {

    public static void quickSort(int[] arr,int start,int end){
        if(start>end) return;
        int left = start;
        int right = end;
        int base = arr[start];
        while(left != right){
            while(left<right && arr[right]>=base){right--;}
            while(left<right && arr[left] <= base){left++;}
            if(left<right){
                swap(arr,left,right);
            }
        }
        swap(arr,start,left);
        quickSort(arr,start,left-1);
        quickSort(arr,left+1,end);
    }

    public static void swap(int[] arr,int left,int right){
        int temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
    }
}

3、冒泡排序

  1. 说明
    交换排序的基本方法是:两两比较待排序记录的排序码,交换不满足顺序要求的偶对,直到全部满足位置。常见的冒泡排序和快速排序就属于交换类排序。
    算法思想: 从数组中第一个数开始,依次遍历数组中的每一个数,通过相邻比较交换,每一轮循环下来找出剩余未排序数的中的最大数并”冒泡”至数列的顶端。

  1. 平均时间复杂度:O(n2)
    平均复杂度 O(n²)
    最好情况 O(n)
    最坏情况 O(n²)
    空间复杂度O(1)
    稳定性 稳定

  2. 适用场景
    它适用于简单数据排序。

  3. 代码

/**
 * 冒泡排序
 */
public class BubleSort {

    public static void bubbleSort(int[] array){
        int length = array.length;
        for(int i=0;i<=length-1;i++){
            boolean swap = Boolean.FALSE;
            for(int j=0;j<length-1-i;j++){
                if(array[j]>array[j+1]){
                    swap(array,j,j+1);
                    swap = Boolean.TRUE;
                }
            }
            if(!swap){
                //已经没有交换了,跳出循环
                break;
            }
        }
    }

    /**
     * 交换函数
     * @param array
     * @param left
     * @param right
     */
    public static void swap(int[] array,int left,int right){
        // 算法一
        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;

        // 算法二
//        array[left] = array[left] +array[right];
//        array[right] = array[left] - array[right];
//        array[left] = array[left]  - array[right];
    }
}

4、快速排序

  1. 说明
    快速排序是一个既高效又不浪费空间的一种排序算法,面试问排序的基本题。
    快速排序是对冒泡排序的改进算法,快速排序采用的思想是分治思想。
    冒泡排序是在相邻的两个记录进行比较和交换,每次交换只能上移或下移一个位置,导致总的比较与移动次数较多。快速排序简单来说就是定义一个标准,大于标准的放一边,小于标准的方另一边,再递归。

  1. 平均时间复杂度
    平均复杂度 O(nlogn)
    最好情况 O(nlogn)
    最坏情况 O(n²)
    空间复杂度O(logn)
    稳定性 不稳定

  2. 适用场景
    快速排序在大多数情况下都是适用的,尤其在数据量大的时候性能优越性更加明显。但是在必要的时候,需要考虑下优化以提高其在最坏情况下的性能。

  3. 代码

/**
 * 快速排序
 */
public class QuickSort {

    public static void quickSort(int[] arr,int start,int end){
        if(start>end) return;
        int left = start;
        int right = end;
        int base = arr[start];
        while(left != right){
            while(left<right && arr[right]>=base){right--;}
            while(left<right && arr[left] <= base){left++;}
            if(left<right){
                swap(arr,left,right);
            }
        }
        swap(arr,start,left);
        quickSort(arr,start,left-1);
        quickSort(arr,left+1,end);
    }

    public static void swap(int[] arr,int left,int right){
        int temp = arr[left];
        arr[left] = arr[right];
        arr[right] = temp;
    }
}

5、简单选择排序

  1. 说明
    选择类排序的基本方法是:每步从待排序记录中选出排序码最小的记录,顺序放在已排序的记录序列的后面,直到全部排完。

  2. 时间复杂度
    平均复杂度 O(n²)
    最好情况 O(n²)
    最坏情况 O(n²)
    空间复杂度O(1)
    稳定性 不稳定

  3. 适用场景
    选择排序实现也比较简单,由于固有的O(n2)复杂度,选择排序在海量数据面前显得力不从心。因此,它适用于简单数据排序。

  4. 代码

/**
 * 简单选择排序
 */
public class SelectionSort {

    public static void selectionSort(int[] arr){
        int length = arr.length;
        int minIndex;
        for(int i=0;i<length -1;i++){
            minIndex = i;
            for(int j= i+1;j<=length-1;j++){
                if(arr[j] < arr[minIndex]){
                    minIndex = j;
                }
            }
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }
}

6、堆排序

  1. 说明

  2. 平均时间复杂度
    平均复杂度 O(nlongn)
    最好情况 O(nlogn)
    最坏情况 O(nlogn)
    空间复杂度O(1)
    稳定性 不稳定

  3. 适用场景
    堆排序在建立堆和调整堆的过程中会产生比较大的开销,在元素少的时候并不适用。但是,在元素比较多的情况下,还是不错的一个选择。尤其是在解决诸如“前n大的数”一类问题时,几乎是首选算法。

  4. 代码

标签:总结,right,int,复杂度,算法,array,排序,left
From: https://www.cnblogs.com/pine007/p/16982829.html

相关文章

  • 算法
    题目:在页面中接收一个用户输入的数字,并判断该数是否是质数。<scripttype="text/javascript">/*质数:只能被1和它自身整除的数,1不是质数也不是......
  • 【算法实践】| 一步步手把手带你实现寻找最小公倍数
    前言其实最小公倍数的概念和计算最小公倍数的方法.那是我们在学习小学数学的时候就已经掌握的数学知识,为了更加通俗易懂一点,本文先从一个'分元宝'的故事入手:亡故的先父留......
  • 接口设计 多字段表格 排序 查询Token
    www.tapd.cn   每个字段都支持排序https://www.tapd.cn/api/basic/token/generate_token_from_array{  "workspace_id":"33345311",  "data":{ ......
  • LeetCode80. 删除排序数组中的重复项 II
    给定一个排序数组,你需要在​​原地​​删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在​​原地​​修改输入数组并在......
  • 算法提高课
    您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:插入数值xx。删除数值xx(若有多个相同的数,应只删除一个)。查询数值xx的排名(若有多个相同......
  • 12月14日内容总结——
    一、模板层之标签分支结构if{%if条件1(可以自己写也可以用传递过来的数据)%}<p>今天又是周三了</p>{%elif条件2(可以自己写也可以用传递过来的数据)%}......
  • javaweb之文件上传总结
    一。文件上传:是指允许客户将本地文件,上传到服务器端 常见的应用:上传照片、上传新闻图片、上传附件 文件上传编程基本步骤: 1、在用户页面中添加上传输入项(客户端页......
  • IPv6改造为什么这么难?IPv6改造方案难点总结-中科三方
      据统计,截至2019年6月,我国IPv6活跃用户数仅为1.3亿,而到2020年底,这个数字需超过5亿。目前网上最早关于IPv4地址枯竭的新闻可追溯到2004年,来源京华时报。     ......
  • 【DBN回归预测】基于麻雀算法优化深度置信网络SSA-DBN实现数据回归多输出预测附matlab
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 个人学期期末总结和对王建民老师的评价
    JavaWeb学习期末总结:这个学期是来到学校本部的第一个学期,也是专业分流后来到软件工程专业继续学习的第一个学期。这是一个全新的学期,什么都是新的,我满怀期待,满怀热情地加入......