Javaプログラミングは、高速ソートに基づく3つのアルゴリズムの実例コードです。
クイックソート原理の概要
急速な並べ替えは私達の前に勉強した泡が昇格するので、彼らはすべて交換種類の並べ替えに属して、すべて絶えない比較と移動を採用して並べ替えを実現しにきたのです。高速ソートは非常に効率的なソートアルゴリズムであり、記録の比較と移動の距離を増加させ、キーワードの大きな記録を前から直接後ろに移動させ、キーワードの小さい記録を後ろから直接前に移動させ、全体の比較回数と移動回数を減少させます。同時に「分割して統治する」という考えを採用して、大きなものを小さいものに分割し、小さいものをより小さいものに分割する原理は以下の通りである。与えられた記録のセットに対して、一つの基準要素を選択して、通常は最初の要素または最後の要素を選択し、一つのスキャンによって、順番待ちの部分を二つの部分に分け、一部は基準要素より小さく、一部は基準要素に等しい。このとき、基準要素は、順序を並べた後の正確な位置において、分割された2つの部分を同じ方法で再帰的に並べて、シーケンス中のすべての記録が整然となるまで並べ替える。
一番小さいk個の数
n個の数を入力して、その中の最小のk個の数を探し出して、例えば4,5,1,6,2,7,3,8を入力して、個の数字、すると最小の数字は1,2,3,4です。
O(n)ベースのアルゴリズムは、Partion関数に基づいてこの問題を解決することができ、配列のk番目の数字に基づいて調整すれば、k番目の数字より小さいすべての数字が配列の左側に位置し、k番目の配列より大きいすべての数字が配列の右側に位置するように、配列の左のk個の数字が最小のk個の数字であり、必ずしも秩序化されない。
配列の中の数字の出現回数が配列長の半分を超えています。この数字を探してください。例えば、1,2,3,2,2,5,4,2,2,2,数字2は、配列内に5回現れ、配列長の半分を超えて2を出力する。
急速な並べ替えのヒントとして、現在の配列の中から数字を選択し、選択した数字より小さい数字を左に並べて、選択した数字より大きい数字を右に並べます。
選択した数字の下付きがちょうどn/2の場合、この数字は配列の中央値です。
たとえば、与えられた配列1,5,2,6,8,0,6のうち、4番目の小さい数字は5です。
以上はJavaプログラミングの高速ソートに基づく3つのアルゴリズムのインスタンスコードのすべての内容です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。
急速な並べ替えは私達の前に勉強した泡が昇格するので、彼らはすべて交換種類の並べ替えに属して、すべて絶えない比較と移動を採用して並べ替えを実現しにきたのです。高速ソートは非常に効率的なソートアルゴリズムであり、記録の比較と移動の距離を増加させ、キーワードの大きな記録を前から直接後ろに移動させ、キーワードの小さい記録を後ろから直接前に移動させ、全体の比較回数と移動回数を減少させます。同時に「分割して統治する」という考えを採用して、大きなものを小さいものに分割し、小さいものをより小さいものに分割する原理は以下の通りである。与えられた記録のセットに対して、一つの基準要素を選択して、通常は最初の要素または最後の要素を選択し、一つのスキャンによって、順番待ちの部分を二つの部分に分け、一部は基準要素より小さく、一部は基準要素に等しい。このとき、基準要素は、順序を並べた後の正確な位置において、分割された2つの部分を同じ方法で再帰的に並べて、シーケンス中のすべての記録が整然となるまで並べ替える。
一番小さい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,5,4,2,2,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プログラミングの高速ソートに基づく3つのアルゴリズムのインスタンスコードのすべての内容です。興味のある方は引き続き当駅の他のテーマを参照してください。友達のサポートに感謝します。