首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Java架构师必看

    十大排序8–堆排序(Heap Sort)

    排序 文章目录 堆排序 基本介绍 大顶堆举例说明 堆排序的基本思想: 简单的思路 代码实现 将一个数组(二叉树), 调整成一个大顶堆 //编写一个堆排序的方法 完整代码 总结: 图解: 基本介绍 堆排序是利用堆这种数据结构二设计的一种排序算法,堆排序是一种选择排序,他的最好最坏,平均复杂度都为O(nlogn), 它也是不稳定排序 堆是具有一下性质的完全二叉树:每个节点的值都大于或者等于其左右孩子节点的值 二叉树), 调整成一个大顶堆 //将一个数组(二叉树), 调整成一个大顶堆 /** * 功能: 完成 将 以 i 对应的非叶子结点的树调整成大顶堆 * 举例 int arr[] = {4, 6, 8, 5, 9}; => i = 1 => adjustHeap => 得到 {4, 9, 8, 5, 6} * 如果我们再次调用 adjustHeap 传入的是 i = 0 => 得到 {4, 9, 8, 5, 6} => {9,6,8,5, 4} * @param arr 待调整的数组 * @param i 表示非叶子结点在数组中索引 * @param lenght 表示对多少个元素继续调整, length

    59220发布于 2021-04-22
  • 来自专栏myTest

    十大排序

    冒泡排序 public class BubbleSort { public static void main(String[] args) { int[] arr = {3, 2, 5, 4, 1, 6, 9, 7, 8, 0}; BubbleSort.sort(arr); for (int i : arr) { System.out.print int tmp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = tmp; } } 桶排序 BucketSort { public static void main(String[] args) { int[] arr = {3, 2, 5, 4, 1, 6, 9, 7, 8, CountSort { public static void main(String[] args) { int[] arr = {3, 2, 5, 4, 1, 6, 9, 7, 8,

    37330编辑于 2025-02-12
  • 来自专栏springBoot3.0

    十大排序

    目录 1、冒泡排序(Bubble Sort) 2、选择排序(Selection Sort) 3、插入排序(Insertion Sort) 4、希尔排序(Shell Sort) 5、归并排序(Merge Sort) 6、快速排序(Quick Sort) 7、堆 排 序(Heap Sort) 8、计数排序(Counting Sort) 9、桶 排 序 (Bucket Sort) 10 基数排序(Radix Sort) 11、 总 结 首先排序算法可以分为内部排序算法和外部排序算法:在内存中进行的称为内部排序算法,也就是这里所说的这十种算法;相应的,当数据量很大时无法全部拷贝到内存需要使用外存,称为外部排序算法 接下来我们可用如下表来简单概括这十种算法: 十大经典排序算法 平均时间复杂度 最好时间复杂度 最坏时间复杂度 空间复杂度 排序方式 稳定性 冒泡排序 O \OmicronO(n2) O \OmicronO idx2) { int tmp = arr[idx1]; arr[idx1] = arr[idx2]; arr[idx2] = tmp; } } 8

    52540编辑于 2023-03-06
  • 来自专栏云计算与大数据技术

    十大排序之冒泡排序

    冒泡排序作为十大排序之一,是一种简单且稳定的排序算法 算法思想可以联想为向湖中下石头和较轻的石头变成泡泡上浮的过程 想象每一块石头处在相应的高度,从上往下相邻两个石头进行比较,较大的石头往下沉,替代下一石头的位置 因此,排序至多需要 n-1 趟(最后一趟只剩一个元素,因此不会再排序),最少需要1趟(已经有序) 算法思想:双重for循环,外层循环控制每次排序元素的长度(被排序的元素个数依次递减),内层循环遍历每轮循环的元素 时间复杂度:O(n^2)       空间复杂度:O(1) 代码实现:(未优化版) package com.gxwz.vo; import java.util.Arrays; /** * Java十大排序之冒泡排序 : [0, 2, 9, 10, 16, 24, 26, 49, 100] [0, 2, 9, 10, 16, 24, 26, 49, 100] 第 8排序: [0, 2, 9, 10, 16 , 24, 26, 49, 100] [0, 2, 9, 10, 16, 24, 26, 49, 100] 优化版: import java.util.Arrays; /** * Java十大排序之冒泡排序

    35530发布于 2021-04-27
  • 来自专栏CodeWwang

    十大排序算法

    将新元素插入到该位置后 重复步骤2~5 代码: void print(int a[], int n ,int i){ cout<<i <<":"; for(int j= 0; j<8; j [0], arr[i]); max_heapify(arr, 0, i - 1); } } int main() { int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 }; int len = (int) sizeof j -= h) { std::swap(array[j], array[j - h]); } } h = h / 3; } } 8 vecCount[vecRaw[i - 1]]] = vecRaw[i - 1]; } int main() { vector<int> vecRaw = { 0,5,7,9,6,3,4,5,2,8,6,9,2,1

    47530编辑于 2022-08-24
  • 来自专栏C++打怪之路

    排序8: 计数排序

    排序思想 2. 图解 3. 代码实现 3.1 逻辑 4. 特性总结 ---- 1. 排序思想 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤: 1. 我们统计完所有数字出现的次数之后,根据次数将数字填入到原数组中,就完成了排序。 这种数字对应下标的叫做绝对映射。 c、排序(将统计好的数字放到数组):我们遍历一遍排好的数组,次数大于1的数字(这里取到的数字需要重新加上min)按次数放到原数组中。 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。 2. 时间复杂度: O(MAX(N, 范围 )) 3.

    48020编辑于 2023-03-31
  • 来自专栏云计算与大数据技术

    十大排序之插入排序

    插入排序作为十大排序之一,是一种简单且稳定的排序算法 算法思想相对直观,可以联想自己平常打扑克牌,发牌时自己边摸牌边整理牌顺序的场景 算法思想:A[i] 与 A[i] 之前的元素 A[j逐个进行比较,如果 i  ] 适用场景:数据量小、有序或者部分有序的数列 时间复杂度:O(n^2)       空间复杂度:O(1) 代码实现: import java.util.Arrays; /** * Java十大排序之插入排序 : [2, 49, 26, 9, 16, 0, 10, 100, 24] [2, 26, 49, 9, 16, 0, 10, 100, 24] 第 3 趟排序: [2, 26, 49, 9, 16, 0, 10, 100, 24] [2, 9, 49, 26, 16, 0, 10, 100, 24] [2, 9, 26, 49, 16, 0, 10, 100, 24] 第 4 趟排序 10, 16, 26, 49, 100, 24] [0, 2, 9, 10, 16, 26, 49, 100, 24] [0, 2, 9, 10, 16, 26, 49, 100, 24] 第 8

    32020发布于 2021-04-27
  • 来自专栏C++

    【C++】十大排序

    时间复杂度分析 选择排序 引言 选择排序(Selection Sort)是一种简单直观的排序算法。 引言 桶排序(Bucket Sort)是一种基于计数的排序算法,工作原理是将数据分到有限数量的桶子里,然后将桶子在分别排序(有可能在使用别的排序算法或者是以递归方式继续使用桶排序进行排序)。 = { 0 }, sum3[256] = { 0 }; for (int i = 0; i <= 9; i++) { ++sum[a[i] & 255]; ++sum1[(a[i] >> 8) i = 0; i <9; i++) b[--sum[a[i] & 255]] = a[i]; for (int i = 9; i >= 0; i--) a[--sum1[(a[i] >> 8) 引言 希尔排序(Shell Sort):是直接插入排序的一种优化,希尔排序通过基于直接插入排序间隔性的将非顺序序列的元素进行排序

    22600编辑于 2024-11-19
  • 来自专栏AllTests软件测试

    十大经典排序算法

    十大经典排序算法 目录 1、前言 2、冒泡排序 3、选择排序 4、插入排序 5、希尔排序 6、归并排序 7、快速排序 8、堆排序 9、计数排序 10、桶排序 11、基数排序 1、 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序 用一张图概括: 关于时间复杂度: 1、平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序 4、线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } 8

    88720编辑于 2023-01-05
  • 来自专栏冷环渊的全栈工程师历程

    十大经典排序算法:快速排序debug分析排序过程

    思路分析 快速排序案例 排序过程断点调试 快速排序测速 快速排序 快速排序法介绍: 快速排序(Quicksort)是对冒泡排序的一种改进。 基本思想是:通过一趟排序将要排序的数据分割成独立的两 部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 对 [-9,78,0,23,-567,70] 进行从小到大的排序,要求使用快速排序法。 【测试 8w 和 800w】 说明[验证分析]: 如果取消左右递归,结果是 -9 -567 0 23 78 70 如果取消右递归,结果是 -567 -9 0 23 78 70 如果取消左递归 ,再拿小冷的快速排序测试一下,算法的精妙之处一下就能感受到了

    45710编辑于 2022-01-26
  • 来自专栏与你一起学算法

    十大经典排序算法之希尔排序算法

    希尔排序 之前我们讲过冒泡排序、选择排序、插入排序,它们的时间复杂度都是 ,比较高,在实际的场景用应用也比较少。 今天我们要讲的希尔排序虽然也是插入排序的一种,但是它是插入排序的一个高效变形,脱离了 的时间复杂度深渊。 /usr/bin/python # -*- coding: utf-8 -*- from typing import List import random def shell_sort_original /usr/bin/python # -*- coding: utf-8 -*- from typing import List import random def shell_sort(array: 希尔排序算法不是稳定的排序算法。前面我们也提到过,只要涉及到大跨度的排序算法,一般都不是稳定的排序算法。 优化 希尔排序的优化主要是针对增量序列的优化。

    75830发布于 2021-03-23
  • 来自专栏java,python,数据结构,算法

    十大经典排序算法详解(二)希尔排序,归并排序,快速排序

    十大经典排序算法-希尔排序,归并排序,快速排序 前言 这是十大经典排序算法详解的第二篇,这是之前第一篇文章的链接:十大经典排序算法详解(一)冒泡排序,选择排序,插入排序,没有看过的小伙伴可以看一下. 按照算法思想不改动的版本: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10}; long startTime 这里我们修改成直接和下一个for循环一起,直接进行循环分组 改进后的代码: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10 sort(num, i+1, right); } } public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10 O(log N) 到这里十大经典排序算法详解的第二期内容就已经结束了.如果觉得UP的文章写得还可以或者对你有帮助的话,可以关注UP的公众号,新人UP需要你的支持!!!

    42930发布于 2021-01-25
  • 来自专栏java,python,数据结构,算法

    十大经典排序算法详解(二)希尔排序,归并排序,快速排序

    十大经典排序算法-希尔排序,归并排序,快速排序 前言 这是十大经典排序算法详解的第二篇,这是之前第一篇文章的链接:十大经典排序算法详解(一)冒泡排序,选择排序,插入排序,没有看过的小伙伴可以看一下. : 示例代码: 按照算法思想不改动的版本: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10}; 这里我们修改成直接和下一个for循环一起,直接进行循环分组 改进后的代码: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10 System.out.println(); return num; } public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10 sort(num, i+1, right); } } public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10

    41420编辑于 2022-01-06
  • 来自专栏精讲JAVA

    十大经典排序算法

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括: ? 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序。 O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序。 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

    1.4K50发布于 2018-12-28
  • 来自专栏Java后端开发博客

    十大经典排序算法

    # 十大经典排序算法 介绍 关于时间复杂度 冒泡排序 插入排序 希尔排序 参考资料 # 介绍 排序算法是《数据结构与算法》中最基本的算法之一。 = i){ arr[j] = tmp; } 第一次循环,i=1,j=1,tmp=8;while:j>0 && tmp<arr[0]:false - >false;j=i,if不成立,第一次循环resultarray:1,8 第二次循环,i=2,j=2,tmp=6;while:j>0 && tmp<arr[1]:true,进入while,arr[2] =arr[1]; //把下标为1的数8赋值给下标为2的元素 j=1;i=2;tmp=6;第二次进入while;while:j>0 && tmp<arr[0]:false -> false;j=1;i=2 ;if成立;arr[1] = 6 第二次循环resultarray:1,6,8 插入排序算法简答一句话就是:从第二个元素到最后一个元素,从后面一个一个插入,插入的数和前面的数一个一个比较,如果它比右边数小

    63520编辑于 2022-12-30
  • 来自专栏全栈程序员必看

    十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

    稳定性 1.3.2 时间复杂度 1.3.3 适用场景 二、选择排序 2.1 选择排序基础【必会知识】 2.2 选择排序优化 2.2.1 选择排序优化图示 2.2.2 选择排序优化实现 2.3 选择排序的稳定性 、复杂度及适用场景 2.3.1 稳定性 2.3.2 时间复杂度 2.3.3 适用场景 三、插入排序 3.1 插入排序基础【必会知识】 3.2 插入排序优化 3.2.1 折半插入排序 3.2.2 2-路插入排序 希尔排序基础 5.1.1 排序过程图示 5.1.2 排序过程实现 5.2 希尔排序优化 5.3 希尔排序的稳定性、复杂度及适用场景 5.3.1 稳定性 5.3.2 时间复杂度 5.3.3 适用场景 一 1.3.3 适用场景   冒泡排序适用于数据量很小的排序场景,因为冒泡的实现方式较为简单。 二、选择排序 2.1 选择排序基础【必会知识】   选择排序是一种简单直观的排序算法。 四、快速排序 4.1 快速排序基础【必会知识】   快速排序也是一种较为基础的排序算法,其效率比冒泡排序算法有大幅提升。

    1.2K50编辑于 2022-09-14
  • 来自专栏java,python,数据结构,算法

    十大经典排序算法详解(一)冒泡排序,选择排序,插入排序

    目录 1.算法的评判标准 2.排序算法的分类 3.十大经典排序算法-冒泡排序,选择排序,插入排序 3.1-冒泡排序 3.2-选择排序 3.3-插入排序 1.算法的评判标准 在讲解排序算法之前,我们首先来了解一下评判一个算法一般都是从哪些角度来评判的 ,这里我们还是通过下面的图来帮助大家加深印象. image.png 了解完上面这些概念之后,接下来我们讲解排序算法的时候提出的一些概念大家就能比较好的理解了. 3.十大经典排序算法-冒泡排序,选择排序, 算法图解: 示例代码 public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10}; long startTime : image.png 算法图解: 示例代码: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10} 算法图解: 示例代码: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10}; long startTime

    36210编辑于 2022-01-06
  • 来自专栏与你一起学算法

    十大经典排序算法之归并排序

    归并排序 前面的时候讲了一些时间复杂度是 的排序算法,虽然希尔排序不是 的排序算法,但是在真正的实际应用中还是比较少的,因为相对来说,排序所需的时间比较长。 今天我就给你介绍另外一种排序算法,归并排序算法。它的时间复杂度是 , 而且是稳定的排序算法,唯一美中不足的一点是它不是原地排序算法,需要使用额外的存储空间。 /usr/bin/python # -*- coding:utf-8 -*- from typing import List def merge_sort(array: List[int]) -> array[j:high+1]) array[low:high+1] = tmp if __name__ == "__main__": array1 = [3, 5, 6, 7, 8] array2 = [2, 2, 2, 2] array3 = [4, 3, 2, 1] array4 = [5, -1, 9, 3, 7, 8, 3, -2, 9] merge_sort

    47920发布于 2021-03-23
  • 来自专栏java,python,数据结构,算法

    十大经典排序算法详解(一)冒泡排序,选择排序,插入排序

    目录 1.算法的评判标准 2.排序算法的分类 3.十大经典排序算法-冒泡排序,选择排序,插入排序 3.1-冒泡排序 3.2-选择排序 3.3-插入排序 1.算法的评判标准 在讲解排序算法之前 了解完上面这些概念之后,接下来我们讲解排序算法的时候提出的一些概念大家就能比较好的理解了. 3.十大经典排序算法-冒泡排序,选择排序,插入排序 3.1-冒泡排序 算法思想: 说到冒泡,大家的第一反应可能就是下图里面金鱼吐泡泡的画面 算法图解: 示例代码: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10}; long startTime : 算法图解: 示例代码: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10}; long 算法图解: 示例代码: public static void main(String[] args) { int []num ={7,4,9,3,2,1,8,6,5,10}; long startTime

    49860发布于 2021-01-21
  • 来自专栏全栈程序员必看

    十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十大经典排序算法 -归并排序算法详解 十大经典排序算法-堆排序算法详解 十大经典排序算法-计数排序算法详解 十大经典排序算法-桶排序算法详解 十大经典排序算法-基数排序算法详解 一、什么是快速排序 1.概念 快速排序(Quick 快速排序在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆解成了两个部分 2.算法原理 这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序 ,右边的都比基准元素大,这一轮交换结束 第一轮,基准元素4将序列分成了两部分,左边小于4,右边大于4,第二轮则是对拆分后的两部分进行比较 此时,我们有两个序列需要比较,分别是3、2、1和7、8、 6、5,重新选择左边序列的基准元素为3,右边序列的基准元素为7 第二轮排序结束后,结果如下所示 此时,3、4、7为前两轮的基准元素,是有序的,7的右边只有8一个元素也是有序的,因此,

    49330编辑于 2022-09-17
领券