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を定義することができます.
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};
次に、この関数オブジェクトをクラスで記述し始めます.パラメータによって<>を使用するか>>を使用するかが決まります.
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;
              }
          }
};
は次にsort(begin,end,compare(ASC)を用いて昇順を実現し、sort(begin,end,compare(DESC)を用いて降順を実現する.
主な関数は次のとおりです.
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はある条件に合致する元素を前に置くように比較的安定している.