C++折半挿入ソートを実現
1364 ワード
「C++インプリメンテーションダイレクト挿入ソート」では、挿入ソートの基本的な操作が1つの順序テーブルで検索および挿入されるため、この「検索」操作は「折半検索」で実現でき、これによって行われる挿入ソートは折半挿入ソートと呼ばれる
次のようになります.
実行結果:
時間と空間の複雑さの分析
スペースの複雑さ:
上記の実装から、折りたたみ挿入ソートに必要な補助空間は、直接挿入ソートと同じである(いずれも補助空間、すなわち哨兵が必要である).
時間の複雑さ:
半角挿入ソートは、キーワードの比較回数を減らすだけで、記録された移動回数は変わりません.したがって,折半挿入ソートの時間的複雑さはO(n*n)のままである.
次のようになります.
#include<iostream>
using namespace std;
#define SIZE_A 9
int main(){
void myshow(int* p,int length);//
int list[SIZE_A]={-1,49,38,65,97,76,13,27,49};
cout<<" :"<<endl;
myshow(list,SIZE_A);
// , 【0】 , 【1】~【length-1】
for(int i=2;i<sizeof(list)/sizeof(int);i++){
list[0]=list[i];// 【0】
int low=1;
int high=i-1;
while(low<=high){// 【low】 【high】
int middle=(low+high)/2;//
if(list[0]<list[middle]){//
high=middle-1;
}else{//
low=middle+1;
}
}//while
for(int j=i-1;j>=high+1;j--){//
list[j+1]=list[j];
}
list[high+1]=list[0];//
}//for
cout<<" :"<<endl;
myshow(list,SIZE_A);
return 0;
}
/*
description:
。
parameter:
int* p:
int length:
*/
void myshow(int* p,int length){
for(int i=0;i<length;i++){
cout<<*(p+i)<<"\t";
}
cout<<endl;
}
実行結果:
時間と空間の複雑さの分析
スペースの複雑さ:
上記の実装から、折りたたみ挿入ソートに必要な補助空間は、直接挿入ソートと同じである(いずれも補助空間、すなわち哨兵が必要である).
時間の複雑さ:
半角挿入ソートは、キーワードの比較回数を減らすだけで、記録された移動回数は変わりません.したがって,折半挿入ソートの時間的複雑さはO(n*n)のままである.