排序是计算机内部经常进行的一种操作,其目的是将一组 “无序” 的数据元素调整为"有序"的数据元素。
- 多关键字排序:
这个就是在排序时需要比较的关键字多余一个,那么是什么意思呢?就是当排序结果首先按关键字 1 进行排序,当关键字 1 相同时按关键字 2 进行排序;…;当关键字 n-1 相同时按关键字 n 进行排序。对于多关键字排序,我们只需要在比较操作时同时考虑多个关键字即可。
#include <iostream>
#include "Object.h"
using namespace std;
using namespace DTLib;
struct Test : public Object
{
int key1;
int key2;
Test(int k1, int k2)
{
key1 = k1;
key2 = k2;
}
bool operator ==(const Test& t)
{
return (key1 == t.key1) && (key2 == t.key2);
}
bool operator !=(const Test& t)
{
return !(*this == t);
}
bool operator >(const Test& t)
{
return (key1 > t.key1) || ((key1 == t.key1) && (key2 > t.key2));
}
bool operator <=(const Test& t)
{
return !(*this > t);
}
bool operator <(const Test& t)
{
return (key1 < t.key1) || ((key1 == t.key1) && (key2 < t.key2));
}
bool operator >=(const Test& t)
{
return !(*this < t);
}
};
int main()
{
Test t1(3, 4);
Test t2(3, 5);
Test t3(2, 4);
Test t4(1, 2);
cout << "t1 < t2 : " << (t1 < t2) << endl;
cout << "t3 > t4 : " << (t3 > t4) << endl;
return 0;
}
在上面的示例中,我们看到排序中的关键操作:比较和交换。
比较 是指任意两个数据元素通过比较操作确定先后次序;交换 是指数据元素之间需要交换才能得到预期结果。
那么我们在进行排序的时候怎么进行判断这个排序是优是劣呢?
1、时间性能:关键性能差异体现在比较和交换的数量;
2、辅助存储空间:为完成排序操作所需要额外的存储空间,必要时可以“空间换时间”;
3、算法的实现复杂性:过于复杂的排序法可能影响可读性和可维护性
#ifndef SORT_H
#define SORT_H
#include "Object.h"
namespace XiebsLib
{
class Sort : public Object
{
private:
Sort();
Sort(const Sort&);
Sort& operator=(const Sort&);
template <typename T>
static void Swap(T& a, T& b)
{
T c = a;
a = b;
b = c;
}
public:
};
}
#endif // SORT_H
- 小结
1、排序是数据元素从无序到有序的过程
2、排序具有稳定性,是选择排序算法的因素之一
3、比较和交换是排序的基本操作
4、多关键字排序与单关键字排序无本质差别
5、排序的时间性能是区分排序算法好坏的主要因素