排序算法 1:冒泡排序(C++版)
1. 冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
1.1 算法描述
1.比较相邻的元素。如果第一个比第二个大,就交换它们两个;
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
3.针对所有的元素重复以上的步骤,除了最后一个;
4.重复步骤1~3,直到排序完成。
1.2 动图演示
1.3 代码实现
template <typename T>
void Swap(T& a, T& b){
T tmp = a;
a = b;
b = tmp;
}
template <typename T>
void BubbleSort(T* begin, T* end){
int len = end - begin;
int i, j;
for (i = 0; i < len; ++i){
for (j = 0; j < len - 1 - i; ++j){
if (*(begin + j) > *(begin + j + 1)){
Swap(*(begin + j), *(begin + j + 1));
}
}
}
}
template <typename T>
void BubbleSort(T** begin, T* end){
int len = end - *begin;
int i, j;
for (i = 0; i < len; ++i){
for (j = 0; j < len - 1 - i; ++j){
if (*(*begin + j) > *(*begin + j + 1)){
Swap(*(*begin + j), *(*begin + j + 1));
}
}
}
}
2. 改进冒泡排序
2.1 改进思想
1.添加一个标志位记录这一趟冒泡是否交换,若没有,则可以停止交换。
2.添加一个标志位置记录这一趟最后交换的位置,下一趟冒泡到这里可以停止。
2.2 代码实现
template <typename T>
void BubbleSort_E1(T* begin, T* end){
int len = end - begin;
int i, j;
for (i = 0; i < len; ++i){
bool flag = false;
for (j = 0; j < len - 1 - i; ++j){
if (*(begin + j) > *(begin + j + 1)){
Swap(*(begin + j), *(begin + j + 1));
flag = true;
}
}
if (!flag){
break;
}
}
}
template <typename T>
void BubbleSort_E2(T* begin, T* end){
int len = end - begin;
int i, j;
int pos = len - 1;
for (i = 0; i < pos; ++i){
for (j = 0; j < len - 1 - i; ++j){
if (*(begin + j) > *(begin + j + 1)){
Swap(*(begin + j), *(begin + j + 1));
pos = j;
}
}
}
}
3. 鸡尾酒排序
3.1 改进思想
鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进。此算法与冒泡排序的不同处在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素。他可以得到比冒泡排序稍微好一点的效能。
3.2 代码实现
template <typename T>
void BubbleSort_E3(T* begin, T* end){
int len = end - begin;
int i;
int left = 0, right = len - 1;
while (left < right){
for (i = left; i < right; ++i){
if (*(begin + i) > *(begin + i + 1)){
Swap(*(begin + i), *(begin + i + 1));
}
}
right--;
for (i = right; i > left; --i){
if (*(begin + i) < *(begin + i - 1)){
Swap(*(begin + i), *(begin + i - 1));
}
}
left++;
}
}