クイックソートの原則の紹介
クイックソートは、以前に学んだバブルソートのアップグレードです。それらはすべてスワップソートに属し、すべて一定の比較と動きを使用してソートを達成します。クイックソートは非常に効率的なソートアルゴリズムです。その実装により、レコードの比較と移動の間の距離が増加し、前から背面へのより大きなキーワードを使用してレコードを移動し、背面から前面に直接キーワードを直接記録し、それにより比較と動きの総数が減少します。同時に、「分裂と征服」のアイデアが採用され、大きなものを小さいものに分割し、小さいものを小さなものに分割します。原則は次のとおりです。特定のレコードのセットでは、ベンチマーク要素を選択します。通常、最初の要素または最後の要素が選択されます。スキャンを介して、ソートされるシーケンスはベンチマーク要素よりも小さい2つの部分に分割され、ベンチマーク要素よりも大きい部分に分割されます。この時点で、ベンチマーク要素はソートされた後に正しい位置にあり、その後、2つの部分は、シーケンス内のすべてのレコードが順序付けられるまで同じ方法で再帰的にソートされます。
1. kの最小数
n番号を入力して、最小のK番号を見つけること、たとえば4,5,1,6,2,7,3,8を入力し、最小の数は1,2,3,4です。
O(n)に基づいて、この問題は分割関数を使用して解決できます。配列のkth番号がkth番号に基づいて調整されている場合、kth番号よりも小さいすべての数値が配列の左側にあり、kthアレイよりも大きいすべての数値が配列の右側にある。調整後、アレイの左側にあるk数値は最小のK番号であり、必ずしも注文されていません。
Import Java.util.scanner; public class main {public static void main(string [] args){scanner in = new scanner(system.in); int n = inextint(); int k = inextint(); int [] num = new int [n]; int [] out = new 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]+"");}}} pintiC boolean getmink(intcminumink( 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 = uiinputnum-1; while(index!= uik-1){if(index> uik-1){// indexはk-1 end = index-1; index = partition(pinputarray、start、end);} else {start = index+1; index = index = pertition(pinputarray、start、end);}}} for(int( i = 0; i <uik; i ++){poutputArray [i] = pinputArray [i];} //パーティションパーティション関数アレイの最初の要素のクイック行のインデックス値を返すインデックスpublic static intパーティション(int [] a、int start、int end){int privot = a int i = a start; 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] = t;}}}}}} 2。配列内の発生の半分以上の数字
配列には、アレイの長さの半分以上が表示される数字があります。この番号を見つけてください。たとえば、1、2、3、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 = inextint(); int [] num = new int [n]; b = gethalfnum(n、num); if(b!= -1){system.out.println(b);}} public static int gethalfnum(int uiinputnum、int [] pinputArray){if(pinputArray == null || uiinputnum <= 0 start = 0; int end = uiinputnum-1; int index = partition(pinputArray、start、end); while(index!= middle){//長さの半分に等しくない場合、中央値が(index> middle){end = index-1; index -1; index = partition(pinputarray、start、end);} else = index+1; index = pertition(pinputarray、start、end);}} return inted inted inted]; 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;}}}}}} 3.配列内のkth最小数を見つけます
たとえば、配列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 = inextint(); int k = inextint(); 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 [] pintorray、int、int、int、int、int [] uik){if(pinputArray == null || uik> uiinputnum || uiinputnum <= 0 || uik <= 0){return -1;} int start = 0; int end = uiinputnum -1; int index = pertition(pinputArray、start、end); while(index!= uik-1){// indexがk-1の位置ではない場合if(index> uik-1){end = index-1; pinputarray、start、end);} else {index+1; index = partition(pinputarray、start、end);}) 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つのアルゴリズムの質問の例に関するこの記事の内容全体です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!