Cpp--C++のソートでよく使われる(菜鳥が出発し、更新を続ける)
5322 ワード
C++のSTLにはsort関数があり、配列を直接ソートできます.この関数を使用するには、ヘッダファイルを含める必要があります.この関数は2つのパラメータまたは3つのパラメータを伝達することができる.1番目のパラメータはソートする区間ヘッダアドレスであり、2番目のパラメータは区間ヘッダアドレスの次のアドレスである.すなわち、ソート区間は[a,b].簡単に言えば、a[0]からa[99]までの要素をソートする配列int a[100]があり、sort(a,a+100)と書けばよいが、デフォルトのソート方式は昇順である.ソートされるデータ型は整数に限定されず、文字列クラスstringなど、演算よりも小さいタイプが定義されている限り可能です.演算より小さいデータ型が定義されていない場合や、ソートの順序を変更したい場合は、第3のパラメータである比較関数を使用します.比較関数は独自に定義された関数で、戻り値はbool型で、どのような関係が「より小さい」かを規定しています.さっきの整数配列を降順に並べたい場合は、まず比較関数cmpを定義することができます.
構造体nodeを定義したと仮定します
コードクリップは次のとおりです.
次の分類について説明します.
一、intタイプ配列の並べ替え
bool cmp(int a,int b)
{
return a>b;
}
ソート時にsort(a,a+100,cmp)と書きます.構造体nodeを定義したと仮定します
struct node{
int a;
int b;
double c;
}
にはnodeタイプの配列node arr[100]があり、それをソートしたい:まずa値の昇順に並べ替え、a値が同じであればb値の降順に並べ替え、bが同じであればc降順に並べ替える.このような比較関数を書くことができます.コードクリップは次のとおりです.
bool cmp(node x,node y)
{
if(x.a!=y.a) return x.a
if(x.b!=y.b) return x.b>y.b;
return return x.c>y.c;
}
並べ替え時にsort(arr,a+100,cmp)を書く.qsort(s[0],n,sizeof(s[0]),cmp);
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
次の分類について説明します.
一、intタイプ配列の並べ替え
int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);
二、charタイプ配列のソート(intタイプと同じ)char word[100];
int cmp( const void *a , const void *b )
{
return *(char *)a - *(int *)b;
}
qsort(word,100,sizeof(word[0]),cmp);
三、doubleタイプ配列のソート(特に注意)double in[100];
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(in,100,sizeof(in[0]),cmp);
四、構造体の一級ソート<pre name="code" class="cpp">struct In
{
double data;
int other;
}s[100]
// data , data ,
int cmp( const void *a ,const void *b)
{
return ((In *)a)->data - ((In *)b)->data ;
}
qsort(s,100,sizeof(s[0]),cmp);
五、对结构体
六、文字列を並べ替えるstruct In { int x; int y; }s[100]; // x , x y int cmp( const void *a , const void *b ) { struct In *c = (In *)a; struct In *d = (In *)b; if(c->x != d->x) return c->x - d->x; else return d->y - c->y; } qsort(s,100,sizeof(s[0]),cmp);
七、列挙型を並べ替えるstruct In { int data; char str[100]; }s[100]; // str int cmp ( const void *a , const void *b ) { return strcmp( ((In *)a)->str , ((In *)b)->str ); } qsort(s,100,sizeof(s[0]),cmp);
enum Enumcomp{ASC,DESC};
次に、この関数オブジェクトをクラスで記述し始めます.パラメータによって<>を使用するか>>を使用するかが決まります.は次にsort(begin,end,compare(ASC)を用いて昇順を実現し、sort(begin,end,compare(DESC)を用いて降順を実現する.class compare { private: Enumcomp comp; public: compare(Enumcomp c):comp(c) {}; bool operator () (int num1,int num2) { switch(comp) { case ASC: return num1<num2; case DESC: return num1>num2; } } };
主な関数は次のとおりです.int main() { int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<<a[i]<<endl; sort(a,a+20,compare(DESC)); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
八、関数テンプレートによるソートタスク
このような単純なタスク(タイプでは「<」、「>」などの比較演算子がサポートされています)については、自分でクラスを書く必要はありません.スタンダードライブラリにはすでに既製品があります.functionalにincludeが入っていればいいです.functionalはテンプレートベースの比較関数オブジェクトの山を提供します.名前を見れば意味がわかりますto、not_equal_to 、greater 、greater_equal 、less 、less_equal .この問題ではgreaterとlessで十分です.直接持ってきてください. 昇順:sort(begin,end,less (); 降順:sort(begin,end,greater () int _tmain(int argc, _TCHAR* argv[]) { int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<<a[i]<<endl; sort(a,a+20,greater<int>()); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
九、反復器におけるstringソート
反復器がある以上、stringであれば逆反復器を使用して逆配列を完了することができます.プログラムは次のとおりです.int main() { string str("cvicses"); string s(str.rbegin(),str.rend()); cout << s <<endl; return 0; }
C++の他の関数を添付します.
関数名機能記述sort指定区間のすべての要素をソートstable_sortは、所与の区間のすべての要素を安定してソートpartial_sort指定区間のすべての要素部分をpartial_にソートsort_copy所定の区間をコピーしてnth_をソートするelementは、所与の区間のある位置に対応する要素isを探し出すsortedは、ある条件に合致する要素を前にstable_partitionはある条件に合致する元素を前に置くように比較的安定している.