關於stable_sort()和sort()的區別:

iam笨笨發表於2020-12-14

 

你發現有sort和stable_sort,還有 partition 和stable_partition, 感到奇怪吧。其中的區別是,帶有stable的函式可保證相等元素的原本相對次序在排序後保持不變。或許你會問,既然相等,你還管他相對位置呢,也分不清 楚誰是誰了?這裡需要弄清楚一個問題,這裡的相等,是指你提供的函式表示兩個元素相等,並不一定是一摸一樣的元素。

例如,如果你寫一個比較函式:

bool less_len(const string &str1, const string &str2)
{
        return str1.length() < str2.length();
}

此時,"apples" 和 "winter" 就是相等的,如果在"apples" 出現在"winter"前面,用帶stable的函式排序後,他們的次序一定不變,如果你使用的是不帶"stable"的函式排序,那麼排序完 後,"winter"有可能在"apples"的前面。

舉例說明:

#include <vector>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
bool comp_as_int(double i, double j)
{
	return (int(i)<int(j));
}
 
int main()
{
	double mydoubles[] = { 3.14, 1.41, 2.72, 4.67, 1.73, 1.32, 1.62, 2.58 };
	vector<double> v;
	vector<double>::iterator it;
 
	v.assign(mydoubles, mydoubles + 8);
 
	cout << "use default comparison:" << endl;
	stable_sort(v.begin(), v.end());
 
	for (it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	cout << endl;
 
	cout << "use selfdefined comparison function comp_as_int():" << endl;
	v.assign(mydoubles, mydoubles + 8);
	//stable sort 是穩定排序。
	stable_sort(v.begin(), v.end(), comp_as_int);
 
	for (it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	cout << endl;
	
	cout << "use comparison function comp_as_int():" << endl;
	v.assign(mydoubles, mydoubles + 8);
	//sort是不穩定排序。
	sort(v.begin(), v.end(), comp_as_int);
 
	for (it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	cout << endl;
 
	cout << "if it is not sorted with stable_sort(), the sequence of all elements between 1 and 2 will be set randomly..." << endl;
 
 
	int n;
	cin >> n;
	return 0;
}
 

相關文章