1. 程式人生 > >【演算法與資料結構】在n個數中取第k大的數(基礎篇)

【演算法與資料結構】在n個數中取第k大的數(基礎篇)

題目介紹

在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]);
	}
	
}

顯示結果