【算法与数据结构】在n个数中取第k大的数(基础篇)

(转载请注明出处:http://blog.csdn.net/buptgshengod

题目介绍

           在n个数中取第k大的数(基础篇),之所以叫基础篇是因为还有很多更高级的算法,这些以后再讨论。本文用两种最基本的方法来解决这个问题。使用java语言描述。例子是十个数中取第三大的。

算法一

             用冒泡法将n个数从大到小排序,再取第k大。
public class test {
   
	public static void main(String []args)
   {
		int i,j;
	    final int n=10;
		final int k=3;
		boolean flag=true;
		
	   int[] list=new int[n];
	   
	   System.out.print("十个数里第三大的数");//题目
	   System.out.println();   //换行

	   for(i=0;i<10;i++)
	   {
		   list[i]=(int) (Math.random()*100);//随机生成100以内十个数
	   System.out.print(list[i]+",");
	   }	  
	   for(j=0;j<list.length-1;j++)
	   {
		   for(i=0;i<list.length-1;i++)
		   {
			   if(list[i]>=list[i+1])
			   {}
			   else
			   {
				   int m=list[i];
				   list[i]=list[i+1];
				   list[i+1]=m;
			   }
		   }
	   }
	   System.out.println();   //换行
	   for(i=0;i<10;i++)
	   {	
		   
	       System.out.print(list[i]+",");
	   }	
	   System.out.println();   //换行
	   System.out.print("答案是"+list[k-1]);
   }
}  

显示结果


算法二

       先取k个数,将他们排序。再从剩下的n-k个数中取数与k个数中最小的比较,如果比k个数最小的大,则替代最小的数。以此类推。
public class Test {

	
	public static void main(String[] args)
	{
		
		int i,j,m;
	    final int n=10;
		final int k=3;
		int[] list=new int[n];
		System.out.print("十个数取第三大");//题目
		System.out.println();//换行
		for(i=0;i<list.length;i++)
		{
			list[i]=(int) (Math.random()*100); 
		    System.out.print(list[i]+",");
		}
		/*
		 * 取数组前三个数,将其按冒泡法从大到小排序
		 */
		for(j=0;j<k-1;j++)
		{
			for(i=0;i<k-1;i++)
			{
				if(list[i]>=list[i+1])
				{}
				else
				{
					int t=list[i];
					list[i]=list[i+1];
					list[i+1]=t;
				}
			}
		}
		
		for(i=k;i<n;i++)
		{
			if(list[k-1]>=list[i])
			{}
			else
			{
				list[k-1]=list[i];
				for(j=0;j<k-1;j++)
				{
					for(m=0;m<k-1;m++)
					{
						if(list[m]>=list[m+1])
						{}
						else
						{
							int t=list[m];
							list[m]=list[m+1];
							list[m+1]=t;
						}
					}
				}
			}
		}
		System.out.println();
		System.out.print("第三大的是"+list[k-1]);
	}
	
}

显示结果

KNN(k-近邻)算法是一种基于实例的学习(instance-based learning)或非泛化学习(non-generalizing learning)的监督学习算法。它可以用于分类和回归。 KNN算法的基本思想是:给定一个新的据点,通过在训练集找到 k 个最近邻居,来预测该据点的类别或值。 据集构造: 为了构造一个适合KNN算法据集,我们可以从以下两个方面考虑: 1. 据点:我们可以随机生成一些据点,或者从已有据集一部分据点。这些据点应该包含需要分类或回归的特征值,以及对应的类别或值。 2. 类别或值:对于分类问题,我们需要为每个数据点标记一个类别,例如二分类问题的0和1。对于回归问题,我们需要为每个数据点标记一个数值。 k值设置: k 值的设置会影响KNN算法的性能。一般来说,k 值应该根据据集的大小和特征量来进行选择。如果据集比较小,可以选择较小的 k 值;如果据集比较大,可以选择较大的 k 值。另外,k 值也可以通过交叉验证来进行选择。 Python实现代码: 下面是一个简单的Python实现KNN算法的代码。其,我们使用sklearn库的KNeighborsClassifier来实现KNN分类器。 ```python from sklearn.neighbors import KNeighborsClassifier # 构造据集 X = [[0, 0], [1, 1], [0, 1], [1, 0]] y = [0, 1, 1, 0] # 创建KNN分类器 knn = KNeighborsClassifier(n_neighbors=3) # 训练模型 knn.fit(X, y) # 预测新据点的类别 print(knn.predict([[1, 2]])) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值