几种经典排序算法。说经典,是因为它们比较简单,而且基本上在任何一本数据结构的书籍上都有论述。
//
// 这是最原始,也是众所周知的最慢的算法了。
// 他的名字的由来因为它的工作看来象是冒泡
//
template < typename T >
void BubbleSort(T * data, int count)
... {
for (int i = 1; i < count; i++)
...{
for (int j = count-1; j >= i; j--)
...{
if (data[j] < data[j-1])
...{
T tmp = data[j];
data[j] = data[j-1];
data[j-1] = tmp;
}
}
}
}
//
// 交换法的程序最清晰简单,
// 每次用当前的元素一一的同其后的元素比较并交换。
//
template < typename T >
void ExchangeSort(T * data, int count)
... {
for (int i = 0; i < count-1; i++)
...{
for (int j = i+1; j < count; j++)
...{
if (data[j] < data[i])
...{
T tmp = data[j];
data[j] = data[i];
data[i] = tmp;
}
}
}
}
//
// 从数据中选择最小的同第一个值交换,
// 再从剩下的部分中选择最小的与
// 第二个交换,这样往复下去。
//
template < typename T >
void SelectSort(T * data, int count)
... {
for (int i = 0; i < count - 1; i++)
...{
T tmp = data[i];
int pos = i;
for (int j = i + 1; j < count; j++)
...{
if (data[j] < tmp)
...{
tmp = data[j];
pos = j;
}
}
data[pos] = data[i];
data[i] = tmp;
}
}
//
// 插入法较为复杂,它的基本工作原理是抽出牌,
// 在前面的牌中寻找相应的位置插入,
// 然后继续下一张
//
template < typename T >
void InsertSort(T * data, int count)
... {
for (int i = 1; i < count; i++)
...{
T tmp = data[i];
int pos = i - 1;
while ((pos >= 0) && (tmp < data[pos]))
...{
data[pos + 1] = data[pos];
pos--;
}
data[pos + 1] = tmp;
}
}
// 这是最原始,也是众所周知的最慢的算法了。
// 他的名字的由来因为它的工作看来象是冒泡
//
template < typename T >
void BubbleSort(T * data, int count)
... {
for (int i = 1; i < count; i++)
...{
for (int j = count-1; j >= i; j--)
...{
if (data[j] < data[j-1])
...{
T tmp = data[j];
data[j] = data[j-1];
data[j-1] = tmp;
}
}
}
}
//
// 交换法的程序最清晰简单,
// 每次用当前的元素一一的同其后的元素比较并交换。
//
template < typename T >
void ExchangeSort(T * data, int count)
... {
for (int i = 0; i < count-1; i++)
...{
for (int j = i+1; j < count; j++)
...{
if (data[j] < data[i])
...{
T tmp = data[j];
data[j] = data[i];
data[i] = tmp;
}
}
}
}
//
// 从数据中选择最小的同第一个值交换,
// 再从剩下的部分中选择最小的与
// 第二个交换,这样往复下去。
//
template < typename T >
void SelectSort(T * data, int count)
... {
for (int i = 0; i < count - 1; i++)
...{
T tmp = data[i];
int pos = i;
for (int j = i + 1; j < count; j++)
...{
if (data[j] < tmp)
...{
tmp = data[j];
pos = j;
}
}
data[pos] = data[i];
data[i] = tmp;
}
}
//
// 插入法较为复杂,它的基本工作原理是抽出牌,
// 在前面的牌中寻找相应的位置插入,
// 然后继续下一张
//
template < typename T >
void InsertSort(T * data, int count)
... {
for (int i = 1; i < count; i++)
...{
T tmp = data[i];
int pos = i - 1;
while ((pos >= 0) && (tmp < data[pos]))
...{
data[pos + 1] = data[pos];
pos--;
}
data[pos + 1] = tmp;
}
}