Java編程基於快速排序的三個演算法題執行個體代碼,java執行個體

來源:互聯網
上載者:User

Java編程基於快速排序的三個演算法題執行個體代碼,java執行個體

快速排序原理簡介

快速排序是我們之前學習的冒泡排序的升級,他們都屬於交換類排序,都是採用不斷的比較和移動來實現排序的。快速排序是一種非常高效的排序演算法,它的實現,增大了記錄的比較和移動的距離,將關鍵字較大的記錄從前面直接移動到後面,關鍵字較小的記錄從後面直接移動到前面,從而減少了總的比較次數和移動次數。同時採用“分而治之”的思想,把大的拆分為小的,小的拆分為更小的,其原理如下:對於給定的一組記錄,選擇一個基準元素,通常選擇第一個元素或者最後一個元素,通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素,此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分,直到序列中的所有記錄均有序為止。

一,最小的k個數

輸入n個數,找出其中最小的k個數,例如輸入4,5,1,6,2,7,3,8,個數字,則最小的數字是1,2,3,4

基於O(n)的演算法,可以用基於Partion函數解決這個問題,如果基於數組的第k個數字來調整,使得比第k個數字小的所有數字都位於數組的左邊,比第k個數組大的所有數字都位於數組的右邊,這樣調整之後數組左邊的k個數字就是最小的k個數字,不一定有序

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in=new Scanner(System.in);int n=in.nextint();int k=in.nextint();int[] num=new int[n];int[] out=new int[k];for (int i=0;i<n;i++){num[i]=in.nextint();}Boolean b=GetMinK(n,num,k,out);if(b){for (int i=0;i<k;i++){System.out.print(out[i]+" ");}}}public static Boolean GetMinK(int uiInputNum, int[] pInputArray, int uiK, int[] pOutputArray){if(pInputArray==null||pOutputArray==null||uiK>uiInputNum||uiInputNum<=0||uiK<=0){return false;}int start=0;int end=uiInputNum-1;int index=partition(pInputArray,start,end);while(index!=uiK-1){if(index>uiK-1){//index在k-1的右邊 end=index-1;index=partition(pInputArray,start,end);} else{start=index+1;index=partition(pInputArray,start,end);}}for (int i=0;i<uiK;i++){pOutputArray[i]=pInputArray[i];}return true;}//partion分區函數,返回數組a的首元素快排的索引值index public static int partition(int[] a,int start,int end){int privot=a[start];int i=start;int j=end;while(i<j){while(i<j&&privot<=a[j]){j--;}swap(a,i,j);while(i<j&&privot>=a[i]){i++;}swap(a,i,j);}return i;}public static void swap(int[] a,int i,int j){int t=a[i];a[i]=a[j];a[j]=t;}}

二,數組中出現次數超過一半的數字

數組中有一個數字出現次數超過數組長度的一半,請找出這個數字。例如1,2,3,2,2,2,5,4,2,數字2在數組中出現了5次,超過數組長度的一半,輸出2

受快速排序的啟發,在快速排序中,現在數組中選擇一個數字,然後調整數組中的數位順序,使得比選中數字小的數字都排在它的左邊,比選中數字大的數字都排在它的右邊。

如果選中的數位下標剛好是n/2,那麼這個數字就是數組中的中位元

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in=new Scanner(System.in);int n=in.nextint();int[] num=new int[n];for (int i=0;i<n;i++){num[i]=in.nextint();}int b=GetHalfNum(n,num);if(b!=-1){System.out.println(b);}}public static int GetHalfNum(int uiInputNum, int[] pInputArray){if(pInputArray==null||uiInputNum<=0){return -1;}int middle=uiInputNum>>1;//長度的一半 int start=0;int end=uiInputNum-1;int index=partition(pInputArray,start,end);while(index!=middle){//如果不等於長度的一半說明就沒有找到這個中位元 if(index>middle){end=index-1;index=partition(pInputArray,start,end);} else{start=index+1;index=partition(pInputArray,start,end);}}return pInputArray[index];//index=middle}public static int partition(int[] a,int start,int end){int privot=a[start];int i=start;int j=end;while(i<j){while(i<j&&privot<=a[j]){j--;}swap(a,i,j);while(i<j&&privot>=a[i]){i++;}swap(a,i,j);}return i;}public static void swap(int[] a,int i,int j){int t=a[i];a[i]=a[j];a[j]=t;}}

三,找出數組中第k個最小的數

例如給定數組1,5,2,6,8,0,6中,第4小的數字是5

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in=new Scanner(System.in);int n=in.nextint();int k=in.nextint();int[] num=new int[n];//int[] out=new int[k]; for (int i=0;i<n;i++){num[i]=in.nextint();}int b=GetMinK(n,num,k);if(b!=-1){System.out.println(b);}}public static int GetMinK(int uiInputNum, int[] pInputArray, int uiK){if(pInputArray==null||uiK>uiInputNum||uiInputNum<=0||uiK<=0){return -1;}int start=0;int end=uiInputNum-1;int index=partition(pInputArray,start,end);while(index!=uiK-1){//如果index不是k-1的位置 if(index>uiK-1){end=index-1;index=partition(pInputArray,start,end);} else{start=index+1;index=partition(pInputArray,start,end);}}return pInputArray[index];//返回的這個位置的數值}public static int partition(int[] a,int start,int end){int privot=a[start];int i=start;int j=end;while(i<j){while(i<j&&privot<=a[j]){j--;}swap(a,i,j);while(i<j&&privot>=a[i]){i++;}swap(a,i,j);}return i;}public static void swap(int[] a,int i,int j){int t=a[i];a[i]=a[j];a[j]=t;}}

總結

以上就是本文關於Java編程基於快速排序的三個演算法題執行個體代碼的全部內容,希望對大家有所協助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.