c/c++でのソートの使用-sort


sort
sortはSTLで提供されるアルゴリズムであり、ヘッダファイルは#includeおよびusing namespace stdである.関数のプロトタイプは次のとおりです.
template <class RandomAccessIterator>
  void sort ( RandomAccessIterator first, RandomAccessIterator last );

template <class RandomAccessIterator, class Compare>
  void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

最初のバージョンは[first,last]を昇順ソートし、デフォルトオペレータは「<」、2番目のバージョンはcomp関数を使用してソート制御を行います.compには[first,last)で対応する2つの値が含まれています.「<」を使用すると昇順ソート、「>」を使用すると降順ソート、int、float、char、および構造体ソートの例は次のとおりです.
#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std;

struct product{
	char name[16];
	float price;
};

int array_int[5]={4,1,2,5,3};
char array_char[5]={'a','c','b','e','d'};
double array_double[5]={1.2,2.3,5.2,4.6,3.5};

//      (              )
bool compare_struct_float(const product &a,const product &b){
	return a.price<b.price;
}
//      (             )
bool compare_struct_str(const product &a,const product &b){
	return string(a.name)<string(b.name);
}
//    
void print_int(const int* a,int length){
	printf("      int  :
"); for(int i=0; i<length-1; i++) printf("%d ",a[i]); printf("%d
",a[length-1]); } void print_char(const char* a,int length){ printf(" char :
"); for(int i=0; i<length-1; i++) printf("%c ",a[i]); printf("%c
",a[length-1]); } void print_double(const double* a,int length){ printf(" dobule :
"); for(int i=0; i<length-1; i++) printf("%.2f ",a[i]); printf("%.2f
",a[length-1]); } void print_struct_array(struct product *array, int length) { for(int i=0; i<length; i++) printf("[ name: %s \t price: $%.2f ]
", array[i].name, array[i].price); puts("--"); } void main() { struct product structs[] = {{"mp3 player", 299.0f}, {"plasma tv", 2200.0f}, {"notebook", 1300.0f}, {"smartphone", 499.99f}, {"dvd player", 150.0f}, {"matches", 0.2f }}; // sort(array_int,array_int+5); print_int(array_int,5); // sort(array_char,array_char+5); print_char(array_char,5); // sort(array_double,array_double+5); print_double(array_double,5); // int len = sizeof(structs)/sizeof(struct product); sort(structs,structs+len,compare_struct_float); printf(" float struct :
"); print_struct_array(structs, len); // sort(structs,structs+len,compare_struct_str); printf(" struct :
"); print_struct_array(structs, len); }

compare関数を記述する際に、標準ライブラリのequal_を使用できます.to、not_equal_to、greater、greater_equal、less、less_equal.この問題にとってgreaterとlessは十分で、直接持ってきて使います:昇順:sort(begin,end,less()降順:sort(begin,end,greater()は、使用時に#includeヘッダファイルを追加する必要があります.たとえば、上のintソートが降順配列になる場合は、次のように変更できます.
sort(array_int,array_int+5,greater<int>());

 
次の手順に従います.http://www.cppblog.com/mzty/archive/2005/12/15/1770.html
STLには、次のようなソート関数もあります.
partion:ある条件に合致する要素を前に置く
stable_partition:ある条件に合致する元素を前に置くように相対的に安定している
nth_Element:指定された区間の位置に対応する要素を特定します.
partial_sort:指定された区間のすべての要素の部分をソート
sort:指定された区間のすべての要素をソート
stable_sort:所与の区間のすべての要素を安定に並べ替える
  • vector,string,deque,arrayコンテナをフルソートするにはsortまたはstable_を選択します.sort;
  • vector,string,deque,またはarrayコンテナでtop nの要素を取得するだけでpartial_を部分的にソートするsortが第一選択です.
  • vector,string,deque,arrayコンテナの場合、n番目の位置の要素を見つける必要があるか、top nを得る必要があり、top nの内部順序に関係なく、nth_elementは最も理想的です.
  • 標準シーケンスコンテナまたはarrayから条件を満たす要素または条件を満たさない要素を分離する必要がある場合は、partitionまたはstable_を使用したほうがいいです.partition;
  • listコンテナを使用すると、partitionとstableを直接使用できます.partitionアルゴリズムではlist::sortの代わりにsortを使用できます.stable_sortソート.partialが必要ならsortまたはnth_elementのソート効果は、間接的に使用する必要があります.上記のようにいくつかの方法が選択できます.参照:
  •  http://blog.csdn.net/ajioy/article/details/6976945
  • http://www.cplusplus.com/reference/algorithm/sort/
  • http://blog.csdn.net/hqwang4/article/details/5623795
  • http://apps.hi.baidu.com/share/detail/2056555
  • http://hi.baidu.com/posinfo/item/dc3e73584c535cc9d2e10c27
  • http://www.cnitblog.com/luckydmz/archive/2006/05/24/11003.html
  • http://www.cplusplus.com/reference/std/functional/less/
  • http://hi.baidu.com/gzyyan/item/c64b5adeb199611de0f46fd4