数组的查找和排序

查找

线性查找法

线性查找法警要查找的关键字key与数组中的元素逐个进行比较,匹配成功,返回关键字在数组中的下标,否则返回-1

/*线性查找*/
public class LinearSearch(){
	public static int linearSearch(int[] list,int key){
		for (int i = 0; i < list.length; i++) {
			if (list[i] == key) {
			return i;
			}
		}
		return -1;
	}
}	

二分查找法

二分查找的前提是数组中的元素必须已经排好序

查找时的三种情况:

  1. 如果关键字小于中间元素,只需要在数组的前一半中继续查找关键字;
  2. 如果关键字等于中间元素,匹配成功,查找结束;
  3. 如果关键字大于中间元素,只需要在数组的后一半中继续查找关键字。
public static int binarySearch(int[] array, int key){
	int low = 0;
	int high = array.length - 1;
	while(high >= low){
		int mid = (low + high)/2;
		if (key < array[mid]) 
			high = mid - 1;
		else if(key == array[mid])
			return mid;
		else {
			low = mid -1;
		}
	}
	return -low-1;//没有找到时,返回-(low+1),其中low+1为应该将该值插入的地方
}

 

排序

  • 选择排序

按升序(降序)排列一个数列,选择排序法先找到数列中的最小数(最大数),然后将它放在数列最前面。接下来,在剩下的数中找到最小数(最大数),将它放在第一个数的后面,依次类推,直到数列中仅剩一个数为止。

public static void main(String[] args) {
	int[] array = new int[]{5,1,3,43,64,36,73,45};
	selectionSort(array);
	System.out.println(Arrays.toString(array));
}

/*
 * 升序排列的选择排序
 * */
public static void selectionSort(int[] array) {
	int tmp;
	//记录排序的趟数
	for (int  i = 0; i < array.length; i++) {
		int minIdx = i;
		//找到每一趟排序的最小值索引
		for (int j = i+1; j < array.length; j++) {
			if (array[j] < array[minIdx]) {
				minIdx = j;
			}
		}
		//第i躺排序,交换最小值到array[i]
		if (minIdx != i) {
			tmp = array[i];
			array[i] = array[minIdx];
			array[minIdx] = tmp;
		}		
	}
	System.out.println(Arrays.toString(array));	
}
  • 插入排序

插入排序法的算法是在已排好序的子数列中反复插入一个新元素来对数列值进行排序,直到整个数列全部排好序。

  1.  不用新建数组:
    public static void insertSort(int[] array) {		
    	int tmp;
    	for (int i = 1; i < array.length; i++) {
    		tmp = array[i];
    		for (int j = i-1; j >= 0; j--) {
    			if (tmp < array[j]) {
    				array[j+1] = array[j];
    			}
    			else {
    				array[j+1] = tmp;
    				break;
    			}
    			if (j-1 == -1) {
    				array[0] = tmp;
    			}
    		}
    	}
    	System.out.println(Arrays.toString(array));		
    }

     

  2. 通过新建一个长度相等的数组来完成,空间开销大
public static void main(String[] args) {
	int[] array = new int[]{5,1,3,100,43,64,36,73,45};
	System.out.println(Arrays.toString(array));
	selectionSort(array);
	insertSort(array);		
}

/*
 * 升序排列的插入排序,空间复杂度为O(n)
 * */
public static void insertSort(int[] array) {
	int[] newArray = new int[array.length];
	int lastPos = 0;
	newArray[0] = array[0];
	for (int i = 1; i < newArray.length; i++) {
		for (int j = lastPos; j >= 0; j--) {
			//比array[i]大的数往后移动一位
			if ( newArray[j] > array[i]) {
				newArray[j+1] =newArray[j];
			}
			//找到要插入的位置,执行插入操作
			else {
				newArray[j+1] = array[i];
				break;
			}
		}
		lastPos++;
	}
	System.out.println(Arrays.toString(newArray));
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用线性查找和二分查找两种方法来查找数组中的元素。 线性查找是逐个遍历数组元素,直到找到目标元素或遍历完整个数组。如果找到目标元素,返回该元素在数组中的索引;如果遍历完整个数组仍未找到目标元素,则返回-1。示例代码如下: ``` public static int getIndex(int[] arr, int key) { for (int i = 0; i < arr.length; i++) { if (arr[i == key) { return i; // 查找到该元素返回该元素在数组中的索引 } } return -1; // 没有查找到该元素返回-1 } ``` 二分查找是一种更高效的查找算法,但要求数组必须有序。它通过将数组分成两部分,并比较目标元素与中间元素的大小来确定目标元素的位置。如果找到目标元素,返回该元素在数组中的索引;如果未找到目标元素,则返回"-插入点"。插入点指的是在数组中将目标元素插入的位置,即范围内第一个大于目标元素的元素索引。示例代码如下: ``` import java.util.Arrays; public class FindArray { public static void main(String[] args) { double[] score = {99.5, 100, 98, 97.5, 110, 95, 85.5, 100}; Arrays.sort(score); // 对数组进行排序 int index1 = Arrays.binarySearch(score, 100); // 查找100的位置 int index2 = Arrays.binarySearch(score, 60); // 查找60的位置 System.out.println("查找到100的位置是:" + index1); System.out.println("查找到60的位置是:" + index2); } } ``` 在以上示例中,我们先使用`Arrays.sort()`方法对数组进行排序,然后使用`Arrays.binarySearch()`方法进行二分查找。当找到目标元素时,返回其在数组中的索引;否则返回"-插入点"。 希望以上解答能满足您的需求,如果还有其他问题,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JAVA--数组元素查找方法](https://blog.csdn.net/Xin6Yang/article/details/88778033)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Java 数组查找指定元素](https://blog.csdn.net/weixin_52899638/article/details/124508080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值