9.11排序与查找(一)——给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序

/**

* 功能:给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序。

*/

	/**
	 * 问题:如果将元素插入数组A的前端,就必须将原有的元素向后移动,以腾出空间。
	 * 思路:将元素插入数组A的末端。
	 *
	 * 注意:在处理完B的元素之后,不需要复制A的剩余元素,因为那些元素原本就在A中。
	 * @param a
	 * @param b
	 * @param lastA
	 * @param lastB
	 */
	public static void merge(int[] a,int[] b,int lastA,int lastB){
		int indexA=lastA-1;
		int indexB=lastB-1;
		int indexMerged=lastA+lastB-1;

		while(indexA>=0&&indexB>=0){
			if(a[indexA]>b[indexB]){
				a[indexMerged]=a[indexA];
				indexMerged--;
				indexA--;
			}else{
				a[indexMerged]=a[indexB];
				indexMerged--;
				indexB--;
			}
		}

		while(indexB>=0){
			a[indexMerged]=a[indexB];
			indexMerged--;
			indexB--;
		}

	}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 14:01:14

9.11排序与查找(一)——给定两个排序后的数组A和B,其中A的末端有足够的缓冲空间容纳B。将B合并入A并排序的相关文章

有两个升序的的数组A1和A2,内存在A1末尾有足够的多余空间容纳A2,设计一个函数,把A2中的所有数字插入到A1中并且所有的数字都是升序的。

此问题和替换空格问题几乎都可以用一个模式高效求解,即都采用从后往前的方法比较A1和A2的数字,然后把较大的数复制到A1合适的位置.防止采用从前往后的方法导致大量的重复移动. 具体思路:类似于merge_sort中的merge过程,首先可以得到合并后A1数组的实际长度(A1.length+A2.length) 依次比较两个数组中的最后一个元素,把较大的数依次放入A数组的末尾,直到A1中元素比较完成或者A2中的数组比较完成. 然后只需要把多出的元素直接插入A1前段即可. 具体的代码如下: 1 #in

有两个排序数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2,实现一个函数,把A2 插入到A1,并且是有序的

题目: 有两个排序的数组A1和A2,内存在A1的末尾有足够的空余空间容纳A2.请写一个函数,把A2的所有数字插入A1中,并且所有的数字是排序的. 首先想到的思路是从A1从头到尾复制数字,但是就会出现多次复制一个数字的情况.更好的办法是从尾到头比较A1和A2的数字,并把较大的数字,复制到A1中的合适位置. 1 class solution{ 2 public static void merge(int[] A1, int[] A2, int lengthA1, int lengthA2){ 3 i

给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。

题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt]到b[bMid]的数小于等于a[aMid],b[bMid+1]到b[bEd]大于等于a[aMid],这样数组a和数组b就被划分为了两个部分,第一个部分的数小于等于a[aMid],第二部分的数大于等于a[aMid],然后统计这两个区域数的个数,个数相加等于k就返回,否则重复二分查找.代码如下: def

9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 可以假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组被旋转过了,则寻找拐点. * @param a * @param left * @param right * @param x:要搜索的元素 * @return */ public static int search(int[] a,int left,int right,int x){ int mid=(

9.11排序与查找(六)——给定M*N矩阵,每一行、每一列都按升序排列,找出某元素

/** * 功能:给定M*N矩阵,每一行.每一列都按升序排列,找出某元素. */ 两种方法: 方法一: /** * 思路:若列的末端大于x,那么x位于该列的左边:若行的开头小于x,那么x位于列的下边.从矩阵中的子矩阵中查找元素. * @param matrix * @param elem * @return */ public static boolean findElement(int[][] matrix,int elem){ int row=0; int col=matrix[0].len

[java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组

1.数组基础 1.什么是数组:           同一类型数据的集合,就是一个容器. 2.数组的好处:           可以自动为数组中的元素从零开始编号,方便操作这些数据. 3.格式:  (一旦创建,必须明确长度)          格式1:              元素类型   [ ]  数组名  =  new  元素类型  [元素个数即数组的长度]:              示例:int[] array = new int[5];          格式2:           

C语言排序和查找

1.C语言选择排序算法及代码 选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置) 3

Python数据结构与算法—排序和查找

排序和查找 排序(Sort)是将无序的记录序列(或称文件)调整成有序的序列. 常见排序方法: 冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 1 # 冒泡 2 def bubble(list_): 3 # 外层循环表达比较多少轮 4 for i in range(len(list_) - 1): 5 #内层循环把控比较次数 6 for j in r

java 数组比较,元素的比较,Comparable,Comparator比较的应用实现,排序,查找示例

java 数组比较,元素的比较,自定义Comparator的实现,排序,查找示例 package org.rui.array.compar; import java.util.Arrays; import java.util.Random; import org.rui.generics.anonymity.Generator; /** * 程序设计的基本目标是"将保持不变的事物与会发生改变的事物相分离" * 而这是,不变的是通用的排序算法,变化的是各种对象相互比较的方式, * 因此,