【排序算法总结】

目录

  • 1. 稳点与非稳定排序
  • 2. 冒泡排序
  • 3. 简单选择排序
  • 4. 直接插入排序
  • 5. 快排
  • 6. 堆排
  • 7. 归并

在这里插入图片描述

1. 稳点与非稳定排序

  • 不稳定的:快排、堆排、选择
  • 原地排序:快排也是
  • 非原地排序:归并 和三个线性时间排序:桶排序 ,计数,基数

2. 冒泡排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 稳定
public class ReviewToo {//1.冒泡排序 时间复杂度 O(n*n)  空间复杂度 O(1) 稳定public int[] BubbleSort(int[] a) {int temp;//空间复杂度的体现boolean flag;o:for (int i = 1; i < a.length; i++) {flag = false;for (int j = 0; j < a.length - i; j++) {if (a[j] > a[j + 1]) {temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;flag = true;}}if (flag == false) {break o;}}return a;}

3. 简单选择排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 不稳定
    //2.简单选择排序 时间复杂度 O(n*n)  空间复杂度 O(1) 不稳定public int[] simpleSelectSort(int[] a) {int temp, min;//空间复杂度的体现for (int i = 0; i < a.length - 1; i++) {min = i;for (int j = i + 1; j < a.length; j++) {if (a[min] > a[j]) {min = j;}}if (min != i) {temp = a[i];a[i] = a[min];a[min] = temp;}}return a;}

4. 直接插入排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 稳定
    //3.直接插入排序 时间复杂度 O(n*n)  空间复杂度 O(1)  稳定public int[] straightInsertionSort(int[] a) {//第一个元素是有序表 后面的是无序表 从后往前插for (int i = 1; i < a.length; i++) {int value = a[i];//要插入的元素int index = i - 1;//要插入的位置while (index >= 0 && value < a[index]) {if (value < a[index]) {a[index+1]=a[index];//索引前移继续找插入位置index--;}}//循环结束找到了插入位置a[index+1]=value;}return a;}}

5. 快排

  • 时间复杂度 O(n* log n)
  • 空间复杂度 O(log n)
  • 不稳定
//4.快排;
// 时间复杂度 O(n* log n)  空间复杂度 O(log n)  不稳定
public class FastSort {public static void quikSort(int[] arr, int left, int right) {// 1.快排终止条件(递归出口):只有一个元素或者无元素,不进行快排if (left >= right) {return;}// 2.选取基准元素:我们以数组左边的元素为基准元素int num = arr[left];// 定义首尾指针int start = left;int end = right;// 3.指针移动条件:指针未相交while (start < end) {// 先移动右边的指针(因为选取的是最左边的元素作为基准元素)//每次找出第一个比基准元素小的 end停到那while (start < end && arr[end] >= num) {end--;}// 再移动左边的指针while (start < end && arr[start] <= num) {start++;}// 两指针终止但没相交,交换元素if (start < end) {int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}}// 4.循环结束两指针相交,排序结束,将基准元素放入指针相交位置arr[left] = arr[start];arr[start] = num;// 5.继续递归:分别对基准元素左右两边的元素进行快排 此时基准元素的左边全部小于它本身,右边全部大于它本身//快排左边quikSort(arr, left, start - 1);//快排右边quikSort(arr, start + 1, right);}//主函数public static void main(String[] args) {int[] arr = {34, 1, 5, -2, 0, 35, 36, 38};//初始的left=0;//right=arr.length-1;quikSort(arr, 0, arr.length - 1);for (int value : arr) {System.out.print(value+" ");}}
}

6. 堆排

//5.堆排;
public class Re {public static void heapSort(int[] arr) {int len = arr.length;int[] top = new int[100];for (int i = 0; i < top.length; i++) {top[i] = arr[i];}buildHeap(top);for (int i = len-1; i >=0 ; i--) {swap(arr,0,i);len--;heapify(arr,0,len);}}public static void buildHeap(int[] arr) {int len = arr.length;for (int i = len / 2 - 1; i >= 0; i--) {heapify(arr, i, len);}}public static void heapify(int[] arr, int i, int len) {int left = 2 * i + 1;int right = 2 * i + 2;int min = i;if (left < len && arr[min] > arr[left]) {min = left;}if (right < len && arr[min] > arr[right]) {min = right;}if (min != i) {swap(arr, min, i);heapify(arr, min, len);}}public static void swap(int[] arr, int i, int j) {int temp;temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

7. 归并

//6.归并排序;
import java.util.Arrays;
public class MergeSort {//一、拆分部分public static void split(int[] arr,int left,int right,int[] temp){//递归拆分if (left<right){int mid=(left+right)/2;//左递归分解split(arr, left, mid, temp);//右递归分解split(arr, mid+1, right, temp);//合并merge(arr,left,right,mid,temp); //这么理解就像递归就是重复干一件事 你调用执行就可//上面 先左递归合并 再右递归合并}}//二、合并部分/*** @param arr   要进行排序的初始数组* @param left  左序列数组的初始索引* @param right 右序列数组的初始索引* @param mid   左序列和右序列的交接地方 中间索引*/public static void merge(int[] arr, int left, int right, int mid, int[] temp) {int i = left;//初始化i,作为左序列的初始索引int j = mid + 1;//初始化j,作为右序列的初始索引 mid是向下取整得来的int index = 0;//temp数组的当前索引//1.左右两边序列按照规则填充到temp数组 直到有一边处理完毕//循环条件 两边的数据均为处理完while (i <= mid && j <= right) {if (arr[i] <= arr[j]) { //左元素<=右 就把左里面的首位填充到temptemp[index] = arr[i];i++;//i后移index++;//index后移} else {//反之就填充右里面的首位temp[index] = arr[j];j++;index++;}}//当while循环结束 就有其中一边先处理完毕//2.把另一边中剩下的的数据直接依次填充到temp数组//满足哪个就去哪个循环进行填充while (j <= right) {temp[index] = arr[j];index++;j++;}while ((i <= mid)) {temp[index] = arr[i];index++;i++;}//3.temp数组拷贝到arr中//只有最后一次拷贝是把整个temp拷贝到arr数组中 前几次都是拷贝temp中的一部分//因为前几次的合并没有占满temp数组index=0;//temp索引归0;int tempLeft=left;
//        System.out.println("tempLeft="+tempLeft+" "+"right="+right);//第1次合并 tempLeft=0,right=1;//第2次合并 tempLeft=2,right=3;//第3次合并 tempLeft=0,right=3;//第4次合并 tempLeft=4,right=5;//第5次合并 tempLeft=6,right=7;//第6次合并 tempLeft=4,right=7;//第7次合并 tempLeft=0,right=7;//最后一次合并while (tempLeft<=right){arr[tempLeft]=temp[index];tempLeft++;index++;}}public static void main(String[] args) {int[] arr = new int[]{8, 4, 5, 7, 6, 2, 3, 9};int[] temp=new int[arr.length];split(arr,0, arr.length-1,temp);System.out.println(Arrays.toString(arr));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/324422.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统基础(09):Linux的文件权限

1. 文件权限是什么 在Linux系统中&#xff0c;文件权限是指对文件或目录的访问权限控制&#xff0c;它由三个部分组成&#xff1a;所有者权限、组权限和其他用户权限。文件权限和用户权限之间有密切的关系&#xff0c;文件权限规定了用户对文件的操作权限&#xff0c;而用户权…

大数据情况下如何保证企业数据交换安全

数据交换是指在网络或其他方式下&#xff0c;不同主体按照规定的规则和标准实现数据的共享、传输和处理的过程。大数据时代的到来使得数据交换的重要性更为凸显&#xff0c;大数据带来了海量、多样、高速、低价值密度等特点&#xff0c;也带来了更多的价值挖掘和应用场景。 保障…

Certum与Geotrust的OV多域名证书

Certum和Geotrust都是知名的CA认证机构&#xff0c;旗下的SSL证书产品丰富&#xff0c;有单域名SSL证书、多域名SSL证书以及通配符SSL证书。这些SSL数字证书作为一种重要的网络安全产品&#xff0c;能够实现数据加密和身份验证&#xff0c;保障网站的安全性和隐私性。OV多域名S…

链接器--动态链接器--延迟绑定与动态链接器是什么?学习笔记三

内容在公众号&#xff0c;新建标签页打开网页&#xff1a; 链接器--动态链接器--延迟绑定与动态链接器是什么&#xff1f;学习笔记三前面的几次笔记记录了静态链接技术、加载时链接的动态链接技术&#xff0c;执行时链接的延迟绑定技术&#xff0c;这次笔记主要研究动态链接器…

性能优化-OpenMP基础教程(四)-Android上运行OpenMP

本文主要介绍如何在一个常规的Android手机上调试OpenMP程序&#xff0c;包括Android NDK的环境配置和使用JNI编写一个OpenMP程序运行在Android手机中。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#…

设计模式之过滤器模式

目录 1.简介 2.过滤器的实现 2.1.过滤器的角色 2.2.类图 2.3.具体实现 3.过滤器模式的优点 4.过滤器模式的不足 5.适用的场景 1.简介 过滤器模式&#xff08;Filter Pattern&#xff09;或标准模式&#xff08;Criteria Pattern&#xff09;是一种结构型设计模式&…

Java基本语法

第一章 Java基本语法 1. Java程序剖析1.1 Java代码的基本格式1.2 包、import1.3 类1.4 main()方法1.5 方法1.6 标识符1.7 关键字1.8 修饰符1.9 程序块1.10 语句1.11 Java代码的注释 2. 常量与变量2.1 常量2.2 变量2.2 变量的分类2.2.1 成员变量2.2.2 局部变…

初识Winform

什么是winform&#xff1f; WinForms&#xff08;Windows Forms&#xff09;是Microsoft .NET框架中的一个用户界面&#xff08;UI&#xff09;技术&#xff0c;用于创建Windows应用程序。它提供了一组用于构建图形用户界面的类和控件&#xff0c;以及与用户交互的事件模型。 …

案例094:基于微信小程序的图书馆自习室座位预约管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Netty初探:掌握高性能网络通信框架,提升Java网络编程技能

Netty初探 NIO 的类库和 API 繁杂 &#xff0c; 使用麻烦&#xff1a; 需要熟练掌握Selector、 ServerSocketChannel、SocketChannel、 ByteBuffer等。 开发工作量和难度都非常大&#xff1a; 例如客户端面临断线重连、 网络闪断、心跳处理、半包读写、 网络拥塞和异常流的处…

【2024最新版】Win11基础配置操作(磁盘分区、修改各种默认存储位置、安装软件操作)【释放C盘空间】

文章目录 一、硬盘分区0. 磁盘管理1. 压缩卷2. 新建简单卷向导 二、修改默认存储位置1. 保持新内容的地方a. 位置b. 操作 2. 快速访问六件套a. 位置b. 操作 三、安装软件0. 应用商店设置a. 设置中心b. 修改下载设置 1. 微信电脑版设置a. 下载b. 安装c. 聊天记录迁移与备份d. 存…

JavaWeb基础(3)-会话技术(cookie和session),过滤器(Filter),监听器(Listener)

JavaWeb基础&#xff08;3&#xff09;-会话技术(cookie和session)&#xff0c;过滤器(Filter)&#xff0c;监听器(Listener) 文章目录 JavaWeb基础&#xff08;3&#xff09;-会话技术(cookie和session)&#xff0c;过滤器(Filter)&#xff0c;监听器(Listener)8 会话技术(Coo…