ソートとその拡張子の挿入
15017 ワード
キャンパスの时間は多くなくて、仕事を探すつもりで、多くのものを見て知識を増やして、自分のために助けます!がんばって!
ソートの挿入:単純なソート方法
基本的な操作:新しいレコードを並べ替えられた秩序配列に挿入します.
時間の複雑さに影響する要因:レコード間の比較と移動
元の挿入ソートアルゴリズム:時間複雑度O(n 2)
折りたたみ挿入ソート:折りたたみ検索を使用して、ソートされた配列の中で、新しいレコードが挿入すべき位置を見つけます.改善効果:記録前の比較回数は減少しましたが、移動回数は変わらないため、時間の複雑さは変わりません.
2ウェイ挿入ソートアルゴリズム:折りたたみ挿入ソートに基づいてさらに改良され、元の配列サイズの配列を補助空間として使用し、記録の移動回数を減らすことを目的としています.注意:選択した最初の要素が配列内の最大または最小の要素である場合、このソート方法は劣化します.
表挿入ソート方法:レコードの移動を減らしますが、時間の複雑さは変わりません.
ヒルソート:インクリメンタルソートの縮小とも呼ばれ、時間効率が向上します.増分配列を使用して、配列内の要素を間隔でソートします.
増分配列の選択については、inc[k]=2 t-k+1+1、ここでtがソート回数、1<=k<=t<=log 2(n+1)のとき、ヒルソートの時間的複雑度はO(n 3/2)であるという統一的な定説はない.
ソートの挿入:単純なソート方法
基本的な操作:新しいレコードを並べ替えられた秩序配列に挿入します.
時間の複雑さに影響する要因:レコード間の比較と移動
元の挿入ソートアルゴリズム:時間複雑度O(n 2)
1 //
2 public void simpleSort(int[] array){
3 for(int i=1; i<array.length; i++){
4 int temp = array[i];
5 if(array[i]<array[i-1]){
6 array[i]=array[i-1];
7 int j=i-2;
8 for(; j>=0&&temp<array[j]; j--){
9 array[j+1]=array[j];
10 }
11 array[j+1]=temp;
12 }
13
14 }
15 }
折りたたみ挿入ソート:折りたたみ検索を使用して、ソートされた配列の中で、新しいレコードが挿入すべき位置を見つけます.改善効果:記録前の比較回数は減少しましたが、移動回数は変わらないため、時間の複雑さは変わりません.
/*
*
* :
* :O(n^2) [ ]
*/
public void binaryInsertSort(int[] array){
for(int i=1; i<array.length; i++){
int temp = array[i];
//
int low = 0;
int high = i - 1;
while(low<=high){
int half = (low+high)/2;
if(array[i]<array[half]){
high = half-1;
}else{
low = half+1;
}
}
for(int j=i-1; j>high; j--){
array[j+1]=array[j];
}
array[high+1]=temp;
}
}
2ウェイ挿入ソートアルゴリズム:折りたたみ挿入ソートに基づいてさらに改良され、元の配列サイズの配列を補助空間として使用し、記録の移動回数を減らすことを目的としています.注意:選択した最初の要素が配列内の最大または最小の要素である場合、このソート方法は劣化します.
1 /*
2 *
3 * :
4 * : n
5 */
6 public int[] tInsertSort(int[] array){
7 int[] cArray= new int[array.length];
8 int start=0,end=array.length-1;
9 int temp = array[0];
10
11 for(int i=1; i<array.length; i++){
12 if(array[i]<=temp){
13 if(cArray[start]==0){
14 cArray[start]=array[i];
15 }else{
16 int j=start;
17 for(; j>=0&&array[i]<cArray[j]; j--){
18 cArray[j+1]=cArray[j];
19 }
20 cArray[j+1]=array[i];
21 start++;
22 }
23
24 }else{
25 if(cArray[end]==0){
26 cArray[end]=array[i];
27 }else{
28 int k=end;
29 for(;k<cArray.length&&array[i]>cArray[k];k++){
30 cArray[k-1]=cArray[k];
31 }
32 cArray[k-1]=array[i];
33 end--;
34 }
35 }
36 }
37 cArray[++start]=temp;
38
39 return cArray;
40 }
表挿入ソート方法:レコードの移動を減らしますが、時間の複雑さは変わりません.
1 /*
2 *
3 * :
4 */
5 public void tableInsertSort(DataItem[] array){
6 for(int i=2;i<array.length;i++){
7 int s=0;
8 while(array[array[s].getNext()].getVal()<array[i].getVal()){
9 s=array[s].getNext();
10 }
11 array[i].setNext(array[s].getNext());
12 array[s].setNext(i);
13 }
14 }
ヒルソート:インクリメンタルソートの縮小とも呼ばれ、時間効率が向上します.増分配列を使用して、配列内の要素を間隔でソートします.
増分配列の選択については、inc[k]=2 t-k+1+1、ここでtがソート回数、1<=k<=t<=log 2(n+1)のとき、ヒルソートの時間的複雑度はO(n 3/2)であるという統一的な定説はない.
1 /*
2 *
3 * ,
4 */
5 public void shellSort(int array[],int[] incArray){
6 for(int i=0; i<incArray.length; i++){
7 incrementSort(array,incArray[i]);
8 }
9 }
10
11 public void incrementSort(int[] array, int inc){
12 // i++ , ,
13 //5-0 6-1 7-2 8-3 9-4 10-5
14
15 for(int i=inc; i<array.length; i++){
16 if(array[i]<array[i-inc]){
17 int temp=array[i];
18 array[i]=array[i-inc];
19 int j=i-2*inc;
20 for(;j>=0&&temp<array[j]; j-=inc){
21 array[j+inc]=array[j];
22 }
23 array[j+inc]=temp;
24 }
25 }
26 }