1.实现大顶堆,用于排序

步骤:

  1. 从数组一半的位置开始建堆;
  2. 不断调整,使最大元素位于顶上
    1. 调整的过程:使根、左孩子、右孩子中的最大值位于根位置;
  3. 交换顶元素和末位置元素,同时元素个数-1
    1. -1是为了避免已换好的元素再参与比较交换
  4. 换好后,再次从顶部进行调整(因为交换后,顶元素已不是最大的了)
package Heap;public class Test {static int len;    // 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量public static void main(String[] args) {int[] array= {4,7,2,8,9,1,3,6,5,0};System.out.println("before:");for(int i=0;i<array.length;i++) {System.out.print(array[i]+" ");}System.out.println();System.out.println("after:");heapSort(array);for(int i=0;i<array.length;i++) {System.out.print(array[i]+" ");}     }public static void buildMaxHeap(int[] arr){// 建立大顶堆len = arr.length;for (int i = len/2; i >= 0; i--) {//建堆,顶为最大heapify(arr, i);}}public static void heapify(int[]arr, int i) {// 堆调整System.out.println("i:"+i);int left = 2 * i + 1,right = 2 * i + 2,largest = i;if (left < len && arr[left] > arr[largest]) {largest = left;}if (right < len && arr[right] > arr[largest]) {largest = right;}if (largest != i) { swap(arr, i, largest);heapify(arr, largest);//换值后要对被换根的子树进行调整}}public static void swap(int[] arr,int i,int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void heapSort(int[] arr) {buildMaxHeap(arr);//先建一个大顶堆,最大值在顶部,即数组0位置for (int i = arr.length - 1; i > 0; i--) {swap(arr, 0, i);//将最大值换到最后一个位置len--; //长度-1,最后一个位置的数就不参与比较置换了,它已为目前的最大值heapify(arr, 0);//将顶元素和最后一个元素交换后再进行堆调整} }}

2.冒泡排序

public class BubbleSort {public static void bubbleSort(int[] arr) {if(arr==null||arr.length<2)return;for(int end=arr.length-1;end>0;end--) {//end为每次比较的范围//第一次比:0~n-1//第二次比:0~n-1//...for(int i=0;i<end;i++) {if(arr[i]>arr[i+1])swap(arr,i,i+1);}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}
}

时间复杂度的计算:

第一次:0~n-1——n次

第二次:0~n-2——n-1次

...

总共:

3.选择排序

第一次比较0~n-1,最小的放在0位置;

第二次比较1~n-1,最小的放在1位置;

...

public class SelectSort {public static void selectSort(int[] arr) {if(arr==null||arr.length<2)return;for(int i=0;i<arr.length;i++) {int minIndex=i;//最小数的下标for(int j=i+1;j<arr.length;j++) {minIndex=arr[minIndex]<arr[j]?minIndex:j;}if(minIndex!=i)swap(arr,i,minIndex);//最小数和目前i位置的交换}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}
}

时间复杂度还是

冒泡排序和选择排序在工程上不怎么用。

它们的比较流程已确定,和元素具体是什么情况无关,都得比较,有序的话只是不交换而已。

4.插入排序

public class InsertSort {public static void insertSort(int[] arr) {if(arr==null||arr.length<2)return;for(int i=1;i<arr.length-1;i++) {//每次插入的元素for(int j=i-1;j>-1;j--)//每次需要比较的元素if(arr[j]<arr[j+1]) {swap(arr,j,j+1);}}}public static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;/*位运算实现交换* arr[i]=arr[i]^arr[j];* arr[j]=arr[i]^arr[j];* arr[i]=arr[i]^arr[j];*/}
}

分最好、最坏和平均。

最好:已有序,且和要求的顺序一致;每次只需和最后一个元素比较,

平均:乱序;

最坏:有序,但和要求顺序相反。每次都需要比较到头,

算法练习day2——190319(大顶堆、冒泡、选择、插入)相关推荐

  1. 大顶堆小顶堆java_《排序算法》——堆排序(大顶堆,小顶堆,Java)

    十大算法之堆排序:堆的定义例如以下: n个元素的序列{k0,k1,...,ki,-,k(n-1)}当且仅当满足下关系时,称之为堆. " ki<=k2i,ki<=k2i+1;或ki ...

  2. 用Java实现二叉堆、大顶堆和小顶堆

    先了解了解 什么是二叉堆 二叉堆就是完全二叉树,或者是靠近完全二叉树结构的二叉树.在二叉树建树时采取前序建树就是建立的完全二叉树.也就是二叉堆.所以二叉堆的建堆过程理论上讲和前序建树一样. 什么是大顶 ...

  3. 大顶堆删除最大值_C++|使用STL算法创建、调整、输出最大堆、最小堆

    最大堆(又叫大根堆.大顶堆)和最小堆是二叉堆的两种形式,一类很重要的数据结构,如用于堆排序等. 最小堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小. 最大堆:根结点的键值是所 ...

  4. c语言大顶堆算法,数据结构之大顶堆

    数据结构之大顶堆(C语言实现) 大顶堆:先用顺序表存储节点(0不存储节点),然后把根节点下面的都当做子树(也就是有n-1颗子树),然后把每个子树中的最大值都放在根节点上. 从顺序表中第n/2个节点也就 ...

  5. 算法 - 堆排序(大顶堆、小顶堆)

    用的是顺序存储二叉树,也就是数组实现的二叉树,遍历的时候按照的是二叉树的形式 代码实现 package tree;import java.util.Arrays;public class HeapSo ...

  6. python树结构实现小顶堆_数据结构和算法入门之小顶堆和大顶堆Python实现

    首先简单提一下小顶堆和大顶堆,其本质是一颗完全二叉树,不同点在于:除叶子节点外,小顶堆的每个父节点的key都要比其左右两个子节点的key小:大顶堆的每个父节点的key都要比其左右两个子节点的key大. ...

  7. 利用大顶堆实现top-k算法

    有一堆二维坐标点<x1,y1>, <x2, y2>--<xn, yn>, 现在有两个问题: 给出n个坐标点,请对他们进行堆排序.坐标点的大小关系是:如果 xi> ...

  8. c语言大顶堆数组维护,图解大顶堆的构建、排序过程

    这两天在复习大顶堆和小顶堆,比起两年前的懵懵懂懂,这次理解起来就容易了一些.又翻看了一下自己之前的笔记数据结构与算法之PHP排序算法(堆排序),发现自己这次查阅资料,和之前的思路不太一样,遂写下这篇笔 ...

  9. 堆排序之 大顶堆和小顶堆 c语言

    百度得到的堆定义如下: 堆的定义如下:n个元素的序列{k1,k2,ki,-,kn}当且仅当满足下关系时,称之为堆. (ki <= k2i,ki <= k2i+1)或者(ki >= k ...

最新文章

  1. JS 正则匹配字符串
  2. 函数式编程——做到并发,不可变数据修改就只能复制后修改返回
  3. CentOS Linux搭建SVN服务器
  4. DL之PerceptronAdalineGD:基于iris莺尾花数据集利用Perceptron感知机和AdalineGD算法实现二分类
  5. netcore docker_深入浅出 ASP.NET Core 与 Docker 入门课程目标说明
  6. 背景素材|令人惊讶水彩背景,新尝试
  7. springmvc06 静态资源
  8. Docker使用阿里云镜像加速
  9. 手动批量下载ts文件并合并
  10. 2022-2028全球婚恋交友软件行业调研及趋势分析报告
  11. Git使用小技巧【git reset和git revert, 你真的知道怎么用吗, 详细图解】
  12. 第九周项目四----广义表算法库及应用1
  13. MFC 如何添加快捷键
  14. 为什么RISC-V中需要恒零寄存器?
  15. 计算机应用基础实训报告excel,excel实验报告模板
  16. mysql重启后数据库消失_linux重启后mysql数据库文件全部丢失mysql无法启动
  17. RaspberryPi 3 B下的64位 uboot linux编译更新
  18. 【强大的视频编辑工具】Adobe Premiere Pro CC 2019 for Mac
  19. Arduino与Proteus仿真实例-AT24C256串行(I2C)EEPROM数据存取驱动仿真
  20. 运用matlab写出单纯形法代码,不列表格的单纯形法,值得一看

热门文章

  1. SELinux与SEAndroid
  2. Swift版音乐播放器(简化版),swift音乐播放器
  3. 开源 java CMS - FreeCMS2.4 菜单管理
  4. 如何防止SQL注入 http://zhangzhaoaaa.iteye.com/blog/1975932
  5. How to Review a Paper
  6. 集合论在图论中的应用的约束描述
  7. CLR自定义菜单项(ToolStripItem)
  8. linux 历史命令列表,fc – 显示历史列表中的命令或修改指定的历史命令并执行。 - Linux 命令大全...
  9. linux deepin 20.4升级至20.5教程:升级系统和升级内核两个步骤(手动升级deepin内核命令)
  10. 解决chrome安装扩展插件导入.crx文件提示:程序包无效的错误