【演算法與資料結構】在n個數中取第k大的數(基礎篇)
阿新 • • 發佈:2019-01-29
題目介紹
在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]); } }
顯示結果