一组N个数,确定其中抵第k个最大值

本文介绍了一种通过冒泡排序及改进算法找到数组中第K大的元素的方法。首先使用冒泡排序对数组进行降序排列,然后提出了一种更高效的算法,即先对前K个元素排序,再逐一比较剩余元素并更新排序结果。

首先,这个问题的最容易想到的就是冒泡排序。先把N个数存入数组中,之后 用冒泡算法从大到小排序,在取k位置的值。

具体求解过程如下:

import java.util.Random;

public class MaxK{

	static int[] nums = new int[20];
	
	static Random rand = new Random(4);

	public static void main(String[] args){
		int k = Integer.parseInt(args[0]);
		init();
		printNums(nums);
		int[] sortBubble = bubbleSort(nums);
		printNums(sortBubble);
		
		System.out.println(sortBubble[k - 1]);
	}


	static void printNums(int[] nums){
		for(int i = 0, len = nums.length; i < len; i++)
			System.out.print(nums[i] + " ");
		System.out.println();
	}
	
	static void init(){
		for(int i = 0; i < 20; i++)
			nums[i] = rand.nextInt(100);
	}
	
	static int[] bubbleSort(int[] nums){
		int arrLen = nums.length;
		int[] bubble = new int[arrLen];	
		System.arraycopy(nums, 0, bubble, 0, arrLen);
		
		for(int i = 0; i < arrLen; i++){
			int tk = bubble[i];
			int tkj = i + 1;
			for(int j = i + 1; j < arrLen; j++){
				if(bubble[j] > tk){	
					tk = bubble[j];
					tkj = j;
				}
			}
			if(tk > bubble[i]){
				int temp = bubble[i];
				bubble[i] = bubble[tkj];
				bubble[tkj] = temp;
			}
		}
		
		return bubble;
	}
}

 还有稍微好一些的算法,就是先把前k个元素读入数组,再对其排序(递减)。接着逐个对比剩下的元素,将符合的元素插入k数组,调整k数组。

	static int maxK(int lk){// 求第lk大的数值
		int[] karr = new int[lk];
		System.arraycopy(nums, 0, karr, 0, lk);
		
		int[] bubbledKarr = bubbleSort(karr);
		int rek = bubbledKarr[lk - 1];
		
		for(int i = lk; i < 20; i++){ //20是nums长度,判断剩下的元素
			if(nums[i] > bubbledKarr[lk -1]){
				int loc = lk -2;
				for(; loc >=0 ; loc--)
					if(nums[i] < bubbledKarr[loc])
						break;
				loc++; //定位插入元素位置
				int[] temp = new int[lk - loc];//需要调整的k数组的值
				System.arraycopy(bubbledKarr, loc, temp, 0, lk - loc);
				bubbledKarr[loc] = nums[i];
				System.arraycopy(temp, 0, bubbledKarr, loc + 1, lk - loc -1);//调整替换元素之后的k数组
				
			}
		}

		return bubbledKarr[lk - 1];
	}

 

 

确定第K个最大值,你可以使用快速选择算法。该算法基于快速排序的思想,但不需要对整个数组进行完全排序,而只需要在部分数组中进行递归操作。 以下是一种基于快速选择算法的实现方法: ```c #include <stdio.h> int partition(int arr[], int low, int high) { int pivot = arr[high]; // 选取最后一个元素作为基准值 int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] <= pivot) { i++; // 交换元素 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // 将基准值放入正确的位置 int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; } int quickSelect(int arr[], int low, int high, int k) { if (low <= high) { int pivotIndex = partition(arr, low, high); // 如果基准值的索引等于K-1,说明找到了第K个最大值 if (pivotIndex == k - 1) { return arr[pivotIndex]; } // 如果基准值的索引大于K-1,说明第K个最大值在基准值的左侧 else if (pivotIndex > k - 1) { return quickSelect(arr, low, pivotIndex - 1, k); } // 如果基准值的索引小于K-1,说明第K个最大值在基准值的右侧 else { return quickSelect(arr, pivotIndex + 1, high, k); } } return -1; // 错误情况 } int findKthLargest(int arr[], int n, int k) { return quickSelect(arr, 0, n - 1, k); } int main() { int arr[] = {10, 5, 8, 12, 3}; int n = sizeof(arr) / sizeof(arr[0]); int k = 3; int kthLargest = findKthLargest(arr, n, k); printf("The %dth largest number is: %d\n", k, kthLargest); return 0; } ``` 在该示例代码中,数组arr为输入的N个数,变量n表示数组的大小,变量k表示要找出的第K个最大值。输出结果为第K个最大值。你可以根据实际需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值