首页 > 编程语言 > 详细

常见的几种排序算法总结及Java实现

时间:2021-03-10 15:13:03      阅读:22      评论:0      收藏:0      [点我收藏+]

一、排序算法概述

1、定义

将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。

2、分类

十种常见排序算法可以分为两大类:

  • 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。

  • 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

技术分享图片

3、比较

技术分享图片

4、相关概念

  • 稳定:如果a原本在b前面且a=b,排序之后a仍然在b的前面。
  • 不稳定:如果a原本在b的前面且a=b,排序之后 a 可能会出现在 b 的后面。
  • 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
  • 空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。
  • 内部排序:所有排序操作都在内存中完成。本文主要介绍的是内部排序。
  • 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需要对外存进行访问的排序过程。

二、各算法原理及实现

下面我们来逐一分析十大经典排序算法,主要围绕下列问题展开:
1、算法的基本思想是什么?
2、算法的代码实现?
3、算法的时间复杂度是多少?(平均、最好、最坏)什么情况下最好?什么情况下最坏?
4、算法的空间复杂度是多少?
5、算法的稳定性如何?

1、冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 

1.1 算法描述

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。
1.2 动图演示
技术分享图片

1.3 代码实现

public class SortDemo {
    public static void main(String[] args) {
        int[] arr = {8, 4, 9, 2, 1, 6, 3, 7, 5, 8};
        System.out.println("排序前:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println("");
        System.out.println("排序后:");
        sort1(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    /*冒泡排序
     *  依次比较相邻的两个元素,通过一次比较把未排序序列中最大(或最小)的元素放置在未排序序列的末尾
     * */
    public static void sort1(int[] arr) {
        System.out.println("冒泡排序:");
        //外层循环,遍历次数
        for (int i = 0; i < arr.length - 1; i++) {
            //内层循环,升序(如果前一个值比后一个值大,则交换) 第i趟比较arr.length-i次
            //内层循环一次,获取一个最大值
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }
}

1.4 分析总结

1.4.1时间复杂度
冒泡排序平均时间复杂度为O(n2),最好时间复杂度为O(n),最坏时间复杂度为O(n2)。
最好情况:如果待排序元素本来是正序的,那么一趟冒泡排序就可以完成排序工作,比较和移动元素的次数分别是 (n - 1) 和 0,因此最好情况的时间复杂度为O(n)。
最坏情况:如果待排序元素本来是逆序的,需要进行 (n - 1) 趟排序,所需比较和移动次数分别为 n * (n - 1) / 2和 3 * n * (n-1) / 2。因此最坏情况下的时间复杂度为O(n2)。

1.4.2 空间复杂度
冒泡排序使用了常数空间,空间复杂度为O(1)

1.4.3稳定性
当 array[j] == array[j+1] 的时候,我们不交换 array[i] 和 array[j],所以冒泡排序是稳定的。

1.4.4算法拓展
鸡尾酒排序,又称定向冒泡排序、搅拌排序等,是对冒泡排序的改进。在把最大的数往后面冒泡的同时,把最小的数也往前面冒泡,同时收缩无序区的左右边界,有序区在序列左右逐渐累积。

2、选择排序(Selection Sort)

 

常见的几种排序算法总结及Java实现

原文:https://www.cnblogs.com/loong-hon/p/14509988.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!