快排与归并排序

devtools/2024/12/27 14:38:44/

   分治思想:快速排序、归并排序
   分治法:将原问题划分为若干个规模较小而结构与原问题一致的子问题,递归解决这些子问题然后在合并结果。容器确定运行时间是分治法优点之一
   分治在每一层递归上都有三个步骤:1、分解:将原问题分解为一系列子问题;2、解决:递归解决各个子问题;3、合并:将子问题的结果合并

   快排重点在于划分,将原数组A根据某一下标q划分为俩个子数组,其中右边数组中的任意一个元素都大于等于A[q],左边数组的任意一个元素都小于等于A[q],这样就不需要合并了。
   归并重点在合并,将原数组划分为俩个子数组,俩个数组各自的排序简单,但合并在一起有难度。

快排:

快排法如何划分:有单向扫描和双向扫描
   单向扫描法:定主元素作为中间值 用俩个指针把数组分为3个区间。扫描指针:该指针左面元素是确认小于主元素的;扫描指针到第二个指针之间的区域为未知,第二个指针为末指针,末指针右边元素确认大于主元素。当扫描指针逐右扫到比主元素大的元素就跟末指针指的元素交换位置。然后扫描指针扫描交换过来的元素,末指针左移一项。

  双向扫描法:头指针往后扫,找到第一个比主元素大的元素,末指针从末尾往前扫,找到第一个比主元素小的元素,然后交换位置

public class Test1 {public static void main(String[] args) {int[] arr = new int[]{4,5,7,2,1,6,7,9,3,23,16,54,8};f1(arr,0,arr.length-1);for (int i : arr) {System.out.println(i);}}
//快排static void f1(int[] arr,int p,int r){ //p为排序范围的左端点,r为右端点//int q=partition1(arr,p,r);int q=partition2(arr,p,r);f1(arr,p,q-1);f1(arr,q+1,r);}}//一遍扫描法static int partition1(int[] arr,int p,int r){int pivot=arr[p];int sp=p+1;//扫描指针int bigger =r;//末指针while(sp<=bigger){if(arr[sp]<=pivot){sp++;}else{swap(arr,sp,bigger);bigger--;}}//此时bigger指向小于等于pivot的最后一个元素,sp指向大于pivot的第一个元素swap(arr,p,bigger);return bigger;}//双向扫描static int partition2(int[] arr,int p,int r){int pivot=arr[p];int left=p+1;int right=r;while(left<=right){while(left<=right && arr[left]<=pivot) left++;while(left<=right && arr[right]>pivot)right--;if(left<right)swap(arr,left,right);}swap(arr,p,right);return right;}//交换数组内元素位置static void swap(int[] arr,int sp,int bigger){int t=arr[sp];arr[sp]=arr[bigger];arr[bigger]=t;}
}

缺陷:当每次定的主元素都为当前子序列中的最大值,这时时间复杂度就会退化为O(n^2);

归并排序

   将原数组简单的划分为俩部分,对俩部分进行排序,然后用俩个指针分别指向俩个子序列的最小值处,比较后,放小的元素放入一个新的数组中,然后小的指针右移。

需要用一个辅助数组helper,复制arr的数据到helper中,在helper中进行比较,然后将结果赋值到arr中。

public class Test1 {public static void main(String[] args) {int[] arr = new int[]{4,5,7,2,1,6,7,9,3,23,16,54,8};//归并排序helper=new int[arr.length];sort1(arr,0,arr.length-1);for (int i : arr) {System.out.println(i);}}static int[] helper;static void sort1(int[] arr,int low,int high){if(low<high){int mid = low+((high-low)>>1);sort1(arr,low,mid);sort1(arr,mid+1,high);merge1(arr,low,mid,high);}}//合并static void merge1(int[] arr,int low,int mid,int high){//把arr中数据拷贝到helper中for(int i=low;i<=high;i++){helper[i]=arr[i];}int left =low; //左侧队伍的头指针,指向待比较的元素int right =mid+1; //右侧队伍的头指针,指向待比较的元素int current=low; //原数组指针,指向待填入元素的位置while(left<=mid && right<=high){ //俩个队伍都没走完if(helper[left]<=helper[right]){arr[current]=helper[left];left++;}else{arr[current]=helper[right];right++;}current++;}while(left<=mid){ //左侧未走完,右侧走完arr[current]=helper[left];left++;current++;}while(right<=mid){ //右侧未走完,左侧走完arr[current]=helper[right];right++;current++;}}
}


http://www.ppmy.cn/devtools/145839.html

相关文章

前端学习DAY26(华为平板页面)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>平板图片</title><style> .box{text-al…

HarmonyOS NEXT 实战之元服务:静态案例效果--- 歌手推荐

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; import { authentication } …

AppAgent 源码 (xml 解析)

1. 数据准备 adb shell uiautomator dump /sdcard/output.xml # 获取手机ui界面的xml文件 adb pull /sdcard/output.xml output.xml # 将手机上的xml文件拉取到电脑上具体的xml文件&#xff1a; <?xml version1.0 encodingUTF-8 standaloneyes ?> <hierarchy ro…

短视频矩阵系统的视频批量剪辑源码技术开发,支持OEM

一、引言 在短视频蓬勃发展的时代&#xff0c;短视频矩阵系统成为了许多内容创作者和营销团队的得力助手。其中&#xff0c;视频批量剪辑功能尤为关键&#xff0c;它能够大幅提高视频制作效率&#xff0c;满足多平台、大规模内容分发的需求。本文将深入探讨短视频矩阵系统中视频…

地球物理场模拟与分析系统——地球磁场研究版

1.产品介绍 产品名称&#xff1a;地球物理场模拟与分析系统——地球磁场研究版 产品概述&#xff1a; 地球物理场模拟与分析系统是一款专注于地球物理场论与数值模拟领域的专业工具&#xff0c;旨在帮助研究人员、工程师以及学生深入探索和研究地球磁场。本系统结合数学地球物…

软考 高级 架构师 第九章系统安全

第九章系统安全 1.信息安全基础知识 1.1.5个基本要素 机密性&#xff1a;确保信息不暴露给未授权的实体或进程。 完整性&#xff1a;只有得到允许的人才能修改数据&#xff0c;并且能够判别出数据是否已被篡改。 可用性&#xff1a;得到授权的实体在需要时可访问数据&#x…

【UE5.3.2】安装metahuman插件

Unable to find plugin ‘MetaHuman’报错 Unable to find plugin MetaHuman (referenced via RPect_5_3.uproject). Install it and try again, or remove it from the required plugin list. 10>Microsoft.MakeFile.Targets(44,5): Error MSB3073 :

Python进阶之opencv图片和视频基本读取关闭

opencv 目录 opencvpip 下载图片基本读取关闭导入前提读取显示和关闭图片属性 视频读取显示和关闭视频读取 pip 下载 在终端下载 已经修改pip源可直接下载&#xff0c;未修改为下面代码 -i 镜像网址 代码展示: pip install opencv-python3.4.18.65 pip install opencv-contrib…