C++ sort排序函式的用法總結

Curtis_發表於2019-03-09

標準模板庫STL中的sort()函式,時間複雜度為n*log2(n),執行效率較高。

 用法:

①、sort()函式可以三個引數也可以兩個引數;

②、必須的標頭檔案 #include < algorithm>和using namespace std。

③、它使用的排序方法類似於快排,時間複雜度為n*log2(n)

sort()函式有三個引數:(第三個引數可不寫)

(1)第一個是要排序的陣列的起始地址。

(2)第二個是最後一位要排序的元素的下一位的地址。

(3)第三個引數是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個引數,此時預設的排序方法是從小到

大排序。 

sort函式,左閉右開,即 int a[10]={2,4,1,23,5,76,0,43,24,65}。 sort(a,a+10)。

兩個引數用法:

#include<iostream>
#include <algorithm>
using namespace std;

int main(){
 	int a[10]={2,4,1,23,5,76,0,43,24,65};
 	for(int i=0;i<10;i++){
 		cout<<a[i]<<" ";
 	}
 	cout<<endl;
	  	
	sort(a,a+10);     //STL中sort函式
 	for(int i=0;i<10;i++){
 		cout<<a[i]<<" ";
 	}
	return 0;
}

輸出結果是升序排列。(兩個引數的sort預設升序排序)

結果:


三個引數:

①、加入一個比較函式 complare():

#include<iostream>
#include <algorithm>
using namespace std;

bool complare(int a,int b){
	return a>b;
} 

int main(){
 	int a[10]={2,4,1,23,5,76,0,43,24,65};
 	
	//列印原陣列 
	for(int i=0;i<10;i++){
 		cout<<a[i]<<" ";
 	}
 	cout<<endl;
	
	//排序  	
	sort(a,a+10,complare);
 	
	//列印排序後的陣列 
	for(int i=0;i<10;i++){
 		cout<<a[i]<<" ";
 	}
	return 0;
}

結果:

②、使用 less<資料型別>(),或 greater<資料型別>():

less<資料型別>()//從小到大排序

greater<資料型別>()//從大到小排序

#include<iostream>
#include <algorithm>
using namespace std;

int main(){
 	int a[10]={2,4,1,23,5,76,0,43,24,65};
 	
	//列印原陣列 
	for(int i=0;i<10;i++){
 		cout<<a[i]<<" ";
 	}
 	cout<<endl;
	
	//排序  	
	sort(a,a+10,greater<int>());
 	
	//列印排序後的陣列 
	for(int i=0;i<10;i++){
 		cout<<a[i]<<" ";
 	}
	return 0;
}

結果:

③、對向量vector排序:

1、使用 sort(vec.begin(),vec.end())排序;

2、使用sort(vec.begin(),vec.end(),greater<int>())排序。

     vector<int> vec(arr,arr+10);   // 用陣列元素初始化vector容器,左閉右開,即+元素數量 。

     sort(vec.begin(),vec.end(),greater<int>());  // <>裡面只需裝容器所容納的元素的型別

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
	int arr[10]={5,6,1,9,3,7,3,1,0,8};
	
    //vector容器存放arr陣列中的元素 
	vector<int> vec(arr,arr+10);   //經典!用陣列元素初始化vector容器,左閉右開,即+元素數量 
	for(int i=0;i<vec.size();i++){
		cout<<vec[i]<<" ";
	} 
	cout<<endl;
	
	//使用預設排序方法: 
	sort(vec.begin(),vec.end());
	cout<<"使用預設排序方法:    ";
	for(int i=0;i<vec.size();i++){
		cout<<vec[i]<<" ";
	}
	cout<<endl;			 
	
	//使用greater<>()規則: 
	sort(vec.begin(),vec.end(),greater<int>());  //這就很神奇了!!!
	
	cout<<"使用greater<>()規則: ";
	for(int i=0;i<vec.size();i++){
		cout<<vec[i]<<" ";
	} 
	
	return 0;	
}

結果:

③、對字元陣列進行排序:

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
	char arr[11]="asdfghjklk";
	
	sort(arr,arr+10,greater<char>());
	
	for(int i=0;i<10;i++){
		cout<<arr[i]<<" ";
	} 
	
	return 0;	
}

結果:

④、對字串排序:

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
	string arr="asdfghjklk";
	
	sort(arr.begin(),arr.end(),less<char>());
	
	for(int i=0;i<10;i++){
		cout<<arr[i]<<" ";
	} 
	
	return 0;	
}

結果:

⑤、 對結構體排序:

1、自定義規則;

2、運算子過載。

1、自定義規則: 

#include<iostream>
#include<algorithm>
using namespace std;

struct student{
	string name;
	int age;	
};

//自己定義的規則:按姓名從小到大排列,若姓名一樣,按年齡從小到大排列 
bool comp(student s1,student s2){
	if(s1.name==s2.name){
		return s1.age<s2.age;
	}
	else{
		return s1.name<s2.name;
	}
}

int main(){
    student s[100];
    s[0].name="zhangsan";s[0].age=19;
    s[1].name="zhangsan";s[1].age=18;
    s[2].name="lisi";s[2].age=20;
    sort(s,s+3,comp);//左閉右開,所以是對s[0]到s[2]排序 
    
	for(int i=0;i<3;i++){
        cout<<s[i].name<<" "<<s[i].age<<endl;
    }
		
	return 0;	
}

 結果:

2、運算子過載:

bool operator < (const student &s) const

#include<iostream>
#include<algorithm>
using namespace std;

struct student{
	string name;
	int age;
	
	bool operator < (const student &s)const{//符號過載 
        if(name==s.name){
            return age<s.age;
        }
        else{
            return name<s.name;
        }
    }
};

int main(){
    student s[100];
    s[0].name="zhangsan";s[0].age=19;
    s[1].name="zhangsan";s[1].age=18;
    s[2].name="lisi";s[2].age=20;
    sort(s,s+3);//左閉右開,所以是對s[0]到s[2]排序 
    
	for(int i=0;i<3;i++){
        cout<<s[i].name<<" "<<s[i].age<<endl;
    }
		
	return 0;	
}

 結果:


string 使用反向迭代器來完成逆序排列

#include <iostream>
using namespace std;

int main()
{
	string str("cvicses"); //用()對字串賦值 
	string s(str.rbegin(),str.rend());  //反向迭代器,將字串str翻轉,賦值給字串s 
	
	cout << s <<endl; //列印字串s 
	return 0;
}

結果:

NOTICE:

 資料量較大時,用sort不太好,比如,員工年齡那道題,這時就要自己寫排序函式了。

相關文章