日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于快速排序思想的三个算法题

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于快速排序思想的三个算法题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,最小的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的首元素快排的索引值indexpublic 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;} }

總結

以上是生活随笔為你收集整理的基于快速排序思想的三个算法题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。