はじめに:
ソートは、クレジットカードの請求書取引などのプロセスを並べ替え、いくつかの論理的な順序に従ってオブジェクトのセットは、日付順にソートされている - この種は、おそらくいくつかの並べ替えアルゴリズム、初期のコンピュータを使用することです、我々は計算期間の30%を考えますこの比率が低下した場合、順序で使用され、おそらく理由の一つは、今より効率的なソートアルゴリズム、重要度の順ではなく減少している、今GFコンピュータの使用は、どこでもデータを作成し、最初のデータを整理しますステップは通常一種です。
あなたが唯一の標準ライブラリにソート機能を使用する場合でも、ソートアルゴリズムを学ぶことは、まだ3実用的な意義を持っています。
- ソートアルゴリズムの分析は、理解し、アルゴリズムの性能比較するのに役立ちます。
- また、問題の他の種類を解決するのに役立つ同様の技法。
- 通常、この問題を解決するための最初のステップを並べ替え、
主なソートアルゴリズム
下列代码展示了我们的习惯约定,将排序代码放在sort()方法中,该类还包含了辅助函数less()和exch();
public class Example {
public static void sort(Comparable[] a){
}
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<0;
}
private static void exch(Comparable[] a,int i ,int j){
Comparable t = a[i];
a[i]=a[j];
a[j]=t;
}
private static void show(Comparable[] a){
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]+" ");
}
System.out.println();
}
public static boolean isSorted(Comparable[] a){
for (int i = 1; i < a.length; i++) {
if (less(a[i],a[i-1])) return false;
}
return true;
}
}
時間の複雑さの解析:
結論:長さnの配列のために、選択ソート約n 2 / n倍と2倍の比較交換
(1-n)の比較+(N-2)+(3-n)を+ ... + N = 2 1 +(1-N)/ 2〜N 2 Nスイッチング時間に、すなわち各インデックス/ 2の比較配列は、交換する必要があります。
選択ソート
アイデアは:全体のアレイがソートされるまで、等アレイ内の最小要素を見つけ、唯一再び最小の残りの要素の第2要素、および配列交換位置を見つけるために、擬似スワップの配列の最初の要素が続く、そしてこの方法は、選択ソートと呼ばれています。
機能:(長さnの単純な配列)
- 実行時間と入力とは独立して、後者は、使用されるすべての同等配列とランダム順列配列要素主キーを指示された限り、ソート時間。
- モバイルデータの最小数;他のアルゴリズムは、この機能を持っていませんだけn回交換、(数桁の成長の大部分が対数であるか、または正方形レベル線形)
public static void sort(Comparable[] a){
int n = a.length;
for (int i = 0; i < n; i++) {
int min = i;
for (int j = i+1; j <n ; j++) {
if (less(a[j],a[min])) min = j;
}
exch(a,min,i);
}
}
挿入ソート
アイデア:残りの部分に私たちが必要とするすべての要素、要素を挿入する余地を作るために、適切な位置に挿入されたカードは、コンピュータ実装に他のカードを命じた、デフォルトは最初のオーダーで購入挿入する権利前に移動し1であり、このアルゴリズムは挿入ソートと呼ばれています。
public static void sort(Comparable[] a){
int n = a.length;
for (int i = 1; i < n; i++) {
for (int j = i; j < n && less(a[j],a[j-1]); j--) {
exch(a,j,j-1);
}
}
}
時間計算分析:すべての要素が位置を移動する必要があり、最良の場合は必要ありません最悪の場合、すなわち、配列がすでにソートされます。
選択ソートと最悪の場合、。N- 2最良の場合の比較/ 2、...、N-1のための比較、すなわちサイクルがFORJはありません。
部分的に順序付けられた配列を考える;反転が11ペアが反転し、EA XA XM XP XL ML ME PL PE LEを有するそのような例のように、逆の順序で二つの要素を指し、逆アレイのアレイサイズの数が少なく、いくつかの承認を超える場合、その後、我々は、配列が部分的に順序付けられていると言う。いくつかの典型的な部分的に秩序配列以下:
- アレイ内の各要素の最終位置から近距離。
- 大の秩序配列は、小さな配列を選びます。
- アレイの位置におけるわずか数の要素が正しくありません。
非常に効果的な挿入ソートこの配列、選択ソート、反転の数、挿入ソートが速く、他のアルゴリズムよりもよい場合、実際にはありません。
シェルソート
ソート高速ソートアルゴリズムベースの挿入、それが唯一のアレイの一端から他端へ少しだけ少ない要素に、隣接する素子をスイッチングすることができるように大規模アレイのスクランブルは、挿入ソート、遅いですプライマリ・キーの最小の要素が配列のちょうど終わりである場合、例えば、その適切な位置に移動するのn-1回は、改善された単純なソート効果的な挿入、ならびに非隣接要素の交換をソーティング速度ヒルするために、移動する必要がありますローカル配列のソート、挿入ソート、最終的には部分的に規則的な配列をソートすると、
逆ペアの数を変えるの核となるアイデア!
逆ペアの数を変更する方法? - Hの任意間隔のアレイ(例えば3などのカスタム、3間隔)は順序素子であることを、このようなアレイは、時間順序付けられた配列と呼ばれます。
配列:H = 4
LEEAMHLEPSOLTSXR
L ---------------------- M ---------------------- P --- ------------------- T
E ---------------------- H -----------------------S- -------------------- S
そして---------------------- ---------------------- L-O- -------------------- X
A ---------------------- E ---------------------- L-- -------------------- R
順序付けられた4つのサブアレイのアレイであるアレイ。
ソートヒル達成する一つの方法:H(挿入ソートアルゴリズム選択)ソートこれらの独立したサブアレイとを徐々にhの値を減少させる、最終H = 1、配列決定され、
コードは以下の通りであります:
public static void sort(Comparable[] a) {
int n = a.length;
int h = 1;
while (h < n / 3) h = 3 * h + 1;
while (h >= 1) {
for (int i = h; i < n; i++) {
for (int j = i; j >= h && less(a[j], a[j - h]); j -= h) {
exch(a, j, j - h);
}
}
h = h / 3;
}
}
コアコード:
for (int j = i; j >= h && less(a[j], a[j - h]); j -= h) {
exch(a, j, j - h);
}
jおよびJHの各値を比較した後、ソートHチーム意志さh = H / 3、数が多すぎるので、反転の数の減少に起因する時間の値、ソート再び挿入し、減少し、そしてランダムに分布アレイ、パフォーマンスはるかに性能の単純な挿入ソートより。
アルゴリズムの性能は、時間にするだけでなく、時間の間の数学的性質だけでなく依存するが、選択する方法のための時間は、何が最善か、まだ決定的ではありません。
それのコードは非常に小さく、追加のメモリ空間を必要としません;熟練したプログラマは、時々そう中規模の配列のために、その実行している時間が許容され、シェルソートを選択し、プラス他の高効率化アルゴリズム、大きなNのために、彼らは唯一のソートビジル倍の速度かもしれ除いて、あなたはスケジューリング問題を解決する必要がありますが、使用可能なシステム機能のない並べ替えがない場合、あなたは、サービス実施後、シェルソートを使用することができれば、より多くの髪が壊し、他のソートアルゴリズムとそれを交換する価値があるかどうかを検討します。