插入,选择,堆,快速排序算法思想与复杂度

这篇具有很好参考价值的文章主要介绍了插入,选择,堆,快速排序算法思想与复杂度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

插入排序

思想

算法步骤

代码

复杂度

选择排序

思想

算法步骤

代码

复杂度

堆排序 

思想

算法步骤

代码

复杂度

 快速排序

 思想

算法步骤

代码

复杂度

稳定性


插入排序

思想

插入排序是一种简单直观的排序算法。它的工作原理是将数组分为已排序未排序两部分,然后依次将未排序元素插入到已排序部分的正确位置,直至整个数组排序完成。

算法步骤

1.从第一个元素开始,将其视为已排序部分

2.取出下一个元素,在已排序部分从后向前进行比较,找到合适的位置并插入

3.重复上述步骤,直到所有元素都被插入到已排序部分。

代码

    public static void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i - 1;
            for (; j >= 0; j--) {
                if(tmp < array[j]) {
                    array[j+1] = array[j];
                }else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }

复杂度

  • 最坏情况时间复杂度:O(n^2) (数组完全逆序)
  • 最好情况时间复杂度:O(n) (数组已经有序)
  • 平均情况时间复杂度:O(n^2)
  • 空间复杂度:O(1) (原地排序)

选择排序

思想

选择排序也是一种简单的排序算法。它的主要思想是每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾,逐步形成有序序列。

算法步骤

1.从数组中找到最小元素,将其与第一个元素交换位置,将第一个元素视为已排序部分。

2.从剩余的未排序部分中找到最小元素,将其与第二个元素交换位置,将前两个元素视为已排序部分。

3.重复上述步骤,直到所有元素都排序完成。

代码

    public static void selectSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            int min = i;
            for (int j = i+1; j < array.length; j++) {
                if (array[j] < array[min]) {
                    min = j;
                }
            }
            swap(array, i, min);
        }
    }


    private static void swap(int[] array, int i, int min) {
        int tmp = array[i];
        array[i] = array[min];
        array[min] = tmp;
    }

复杂度

  • 最坏情况时间复杂度:O(n^2)
  • 最好情况时间复杂度:O(n^2)
  • 平均情况时间复杂度:O(n^2)
  • 空间复杂度:O(1) (原地排序)

堆排序 

思想

堆排序是一种高效的排序算法,利用了二叉堆的数据结构。它通过构建最大堆(升序排序时使用)或最小堆(降序排序时使用)来进行排序。

算法步骤

1.将输入数组构建成一个二叉堆。

2.不断从堆顶取出最大(或最小)元素,放入已排序部分的末尾,并调整堆保持其性质。

3.重复上述步骤,直到所有元素都被取出,形成有序序列。

代码

    public static void heapSort(int[] array) {
        createBigHeap(array);
        int end = array.length - 1;
        while (end > 0) {
            swap(array,0,end);
            siftDown(array,0,end);
            end--;
        }
    }

    private static void createBigHeap(int[] array) {
        for (int parent = (array.length-1-1) / 2; parent >= 0; parent--) {
            siftDown(array,parent,array.length);
        }
    }

    private static void siftDown(int[] array, int parent, int end) {
        int child = parent*2 + 1;
        while (child < end) {
            if(child+1 < end && array[child] < array[child+1]) {
                child++;
            }
            if (array[child] > array[parent]){
                swap(array,child,parent);
                parent = child;
                child = parent*2 + 1;
            }else {
                break;
            }
        }
    }

复杂度

  • 最坏情况时间复杂度:O(n log n)
  • 最好情况时间复杂度:O(n log n)
  • 平均情况时间复杂度:O(n log n)
  • 空间复杂度:O(1) (原地排序)

 快速排序

 思想

快速排序是一种常用且高效的排序算法,它采用了分治的思想。快速排序的核心在于选取一个基准元素,将数组分为左右两个子数组,使得左边的元素都小于等于基准,右边的元素都大于等于基准,然后对子数组递归地进行快速排序。

算法步骤

1.选择一个基准元素(通常为数组的第一个或最后一个元素)。

2.将数组分成两个子数组,使得左边子数组的元素都小于等于基准,右边子数组的元素都大 于等于基准。

3.对左右子数组递归地进行快速排序。

4.将左边子数组、基准元素和右边子数组合并成最终的有序数组。

代码

    public static void quickSort(int[] array) {
        quick(array,0,array.length-1);
    }

    private static void quick(int[] array, int start, int end) {
        if(start >= end) {
            return;
        }
        int pivot = partition(array,start,end);
        quick(array,start,pivot-1);
        quick(array,pivot+1,end);
    }

    //挖坑法
    private static int partition(int[] array, int start, int end) {
        int key = array[start];
        while (start < end) {
            while (start < end && array[end] >= key) {
                end--;
            }
            array[start] = array[end];
            while (start < end && array[start+1] <= key) {
                start++;
            }
            array[end] = array[start];
        }
        array[start] = key;
        return start;
    }

复杂度

  • 最坏情况时间复杂度:O(n^2) (基准选取不当导致)
  • 最好情况时间复杂度:O(n log n) (每次都能将数组平衡地分割)
  • 平均情况时间复杂度:O(n log n)
  • 空间复杂度:O(log n) (递归调用栈的深度

稳定性

稳定的排序:插入排序,选择排序

不稳定排序:快速排序,堆排序文章来源地址https://www.toymoban.com/news/detail-615900.html

到了这里,关于插入,选择,堆,快速排序算法思想与复杂度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 快速排序的非递归实现、归并排序的递归和非递归实现、基数排序、排序算法的时间复杂度

    快速排序的非递归实现、归并排序的递归和非递归实现、基数排序、排序算法的时间复杂度

    我们使用一个栈来模拟函数的递归过程,这里就是在利用栈分区间。把一个区间分为 [left,keyi-1][key][keyi+1,right]递归下去,直至区间不存在或left right。 如图所示: 先把整体的区间压进去,然后出栈,处理完毕后找到keyi再分为左右两个区间。然后往栈里压有区间,压左区间,就

    2024年02月17日
    浏览(9)
  • (排序3)希尔排序时间复杂度与直接选择排序

    (排序3)希尔排序时间复杂度与直接选择排序

    希尔排序分组预排的目的就在于比如说我要对数据进行升序排序,那么就是可以达到让大的数尽快的调到后面 然后接下来随着gap的不断缩小,间隔越来越小,组也就越来越多,最终整个数组的话是越来越接近有序。 最终的话,你必须要保证这个gap为1,就是说最终必须得进行

    2023年04月08日
    浏览(8)
  • 【排序算法】排序算法的复杂度

            归并排序是证明计算复杂度领域的一个重要结论的基础,而计算复杂性能够帮助我们理解排序自身固有的难易程度。计算复杂性在算法设计中扮演着非常重要的角色。         研究复杂度的第一步是建立一个计算模型。一般来说,研究者会尽量寻找一个和问题相关的

    2024年01月21日
    浏览(7)
  • 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

    八大排序算法(含时间复杂度、空间复杂度、算法稳定性)

    下列算法默认都是对数组进行升序 1.1、算法思想 插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序的具体步骤如下: 从第一个元素开始,该元素可以认为已经被排序;

    2024年02月08日
    浏览(8)
  • 快速排序空间复杂度( O(logn)-o(N))

    快速排序空间复杂度( O(logn)-o(N))

    1.不理解快速排序,看这篇博客  http://t.csdn.cn/Sgzmc 2.快排的空间复杂度 快排并没有开辟空间,但是使用了递归, 递归会开辟栈帧 递归算法的空间复杂度 = 每次递归的空间复杂度 * 递归深度 每次递归所需要的空间大小都是一样的而且就算是第N次递归,每次递归所需的栈空间

    2024年02月16日
    浏览(7)
  • 常见的排序算法的时间复杂度

    常见的排序算法的时间复杂度

    排序算法的时间复杂度通常取决于输入数据的规模(通常表示为n)。以下是一些常见排序算法及其平均、最好和最坏情况下的时间复杂度: 1、冒泡排序(Bubble Sort) 平均时间复杂度:O(n^2) 最好情况时间复杂度:O(n) 最坏情况时间复杂度:O(n^2) 冒泡排序通过重复地遍历待排序

    2024年04月13日
    浏览(10)
  • 常见的排序算法及时间空间复杂度

    常见的排序算法及时间空间复杂度

    排序算法是计算机科学中的基本算法之一,它用于将一组数据按照某种顺序进行排列。下面是一些常见的排序算法,以及它们的思想和时间空间复杂度,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 冒泡排序 (Bubble Sort) - 思

    2024年02月07日
    浏览(9)
  • 排序算法的时间复杂度存在下界问题

    排序算法的时间复杂度存在下界问题

    对于几种常用的排序算法,无论是归并排序、快速排序、以及更加常见的冒泡排序等,这些排序算法的时间复杂度都是大于等于O(n*lg(n))的,而这些排序算法存在一个共同的行为,那就是这些算法在对元素进行排序的时候,都会进行同一个操作,也就是对数组中取出文件,然后

    2024年02月21日
    浏览(13)
  • 数据结构和常用排序算法复杂度

    数据结构和常用排序算法复杂度

    插入操作时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数n/2 删除操作时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数(n-1)/2 按值查找时间复杂度 最好O(1),最坏O(n),平均O(n) 移动结点的平均次数(n+1)/2 头插法O(n) 尾插法O(n) 按序查找O(n) 按值查找O(n) 插入

    2024年02月11日
    浏览(10)
  • 三路快排(基于三指针单趟排序的快速排序)+快排时间复杂度再分析

    三路快排(基于三指针单趟排序的快速排序)+快排时间复杂度再分析

    目录  一.前言 二. 三路快排 😍算法思想: 😍算法实现步骤: 😍三指针单趟排序的实现:​ 😍非递归快排完全体: 🤔与C标准库里的快排进行对比测试: 三.快排时间复杂度再分析 http://t.csdn.cn/mz8dg http://t.csdn.cn/mz8dg http://t.csdn.cn/1TqDp http://t.csdn.cn/1TqDp 😄关于快排的基本思想和实

    2023年04月15日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包