冒泡排序可能是很多人接触到的第一种排序方法,最值会不断的“浮”到区间右端。
第一个版本
void bubble_sort(int a[], int n)
{
for (int i = 0; i < n - 1; ++i)
// i用于确保区间右端点前移
{
for (int j = 0; j < n - 1 - i; ++j)
// 需要比较的区间不断前缩
{
if (a[j] > a[j + 1])
std::swap(a[j], a[j + 1]);
}
}
}
第二个版本
void bubble_sort_opt1(int a[], int n)
//已经升序的序列,扫描过一遍后就停止
{
for (int i = 0; i < n - 1; ++i)
{
bool swaped = false;
for (int j = 0; j < n - 1 - i; ++j)
if (a[j] > a[j + 1])
{
std::swap(a[j], a[j + 1]);
swaped = true;
}
if (swaped == false)
break;
}
}
第三个版本
void bubble_sort_opt2(int a[], int n)
//准确记录有序区间,避免重复比较
{
int last_exchange_pos = n - 1; //[last_exchange_pos, n-1]是有序区域
for (int i = 0; i < n - 1; ++i)
{
bool swaped = false;
int temp_pos = 0;
for (int j = 0; j < last_exchange_pos; ++j)
{
if (a[j] > a[j + 1])
{
std::swap(a[j], a[j + 1]);
swaped = true;
temp_pos = j;
}
}
last_exchange_pos = temp_pos;
if (swaped == false)
break;
}
}