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

news/2024/12/22 1:57:49/

目录

插入排序

思想

算法步骤

代码

复杂度

选择排序

思想

算法步骤

代码

复杂度

堆排序 

思想

算法步骤

代码

复杂度

 快速排序

 思想

算法步骤

代码

复杂度

稳定性


插入排序

思想

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

算法步骤

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) (递归调用栈的深度

稳定性

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

不稳定排序:快速排序,堆排序


http://www.ppmy.cn/news/973782.html

相关文章

使用 Flask 快速构建 基于langchain 和 chatGPT的 PDF摘要总结

简介 这里不对 langchain 和 chatGPT 进行介绍&#xff0c;仅对实现过程进行整理 环境 Python >3.8 Flask2.2.3 Jinja23.1.2 langchain0.0.143 openai0.27.4 实现 总结功能 使用 langchain 和 openai 接口实现总结功能 实现逻辑&#xff1a;通过text_splitter 将pdf 分…

pytorch如何混合进度训练transformer【各种不同方式】

Trainer&#xff0c; no trainer&#xff0c; accelerator 用huggingface 的Trainer Hugging Face 的 Transformers 库为我们提供了大量预训练的 Transformer 模型&#xff0c;以及一个易于使用的训练和微调工具——Trainer。在 Trainer 中&#xff0c;我们可以很容易地启用混…

PAT乙题1007

答案 #include <iostream> #include<cstdio> #include<string> #include<vector> using namespace std; int ans; vector<int> ve; bool check(int x) {for (int i 2; i < x / i; i){if (x % i 0) return false;}return true; } int main(…

【算法基础:数学知识】4.2 约数

文章目录 约数介绍例题列表AcWing 869. 试除法求约数 &#xff08;求一个数的所有约数&#xff09;AcWing 870. 约数个数&#xff08;求一些数相乘之后的结果有几个约数&#xff0c;答案可能很大&#xff09;约数个数定理⭐解法代码 AcWing 871. 约数之和解法公式⭐ AcWing 872…

python[爬虫]爬取百万条新浪新闻 新浪滚动新闻中心(多进程)

最近在做python爬取新闻&#xff0c;所以分别研究了下新浪、网易、中国新闻网的爬取方法。其他几个网页的新闻爬取我的博客里都有&#xff0c;请自行查看~ 首先&#xff0c;因为需获取的数据为百万级别&#xff0c;所以直接选择了新浪的滚动新闻中心 https://news.sina.com.cn/…

python爬虫:爬取新浪新闻数据

1. 爬虫的浏览器伪装原理&#xff1a; 我们可以试试爬取新浪新闻首页,我们发现会返回403 ,因为对方服务器会对爬虫进行屏蔽。此时,我们需要伪装成浏览器才能爬取。 1.实战分析&#xff1a; 浏览器伪装一般通过报头进行&#xff1a; 打开某个网页&#xff0c;按F12—Network…

Python爬虫实战案例:爬取新闻资讯

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 一个简单的Python资讯采集案例&#xff0c;列表页到详情页&#xff0c;到数据保存&#xff0c;保存为txt文档&#xff0c;网站网页结构算是比较规…

python爬虫爬取新浪网站新闻内容

我们以爬取sina时尚模块为例 准备工作 为进行爬虫爬取工作&#xff0c;我们需要进行相关库的准备以及对网页设置布局的了解 相关库的准备 import os import re import urllib from bs4 import BeautifulSoup from lxml import etree import json import requests网页布局的信息…