冒泡: 比较相邻元素 位置不对交换
升序:每次最大值移到最后 降序:每次最小值移到最后
//核心代码
int i, j, k;
int a[5] = { 12,31,32,1,22 };
for (i = 0; i < N - 1; i++)
{
for (j = 1; j < N - i; j++)
{
if (a[j - 1] < a[j])//降序
{
int t = a[j - 1];
a[j - 1] = a[j];
a[j] = t;
}
}
}
升序:每次最小值 移到前面 降序:每次最大值移到前面
//核心算法
int i, j, k;
int a[5] = { 12,31,32,1,22 };
for (i = 0; i < N - 1; i++)
{
for (j = N - 1; j > i; j--) //j>i 为什么?
{
//--从后向前比较 j - 1 --若 >= i 比较下标越界
if (a[j - 1] < a[j]) //降序 最大值移到前面
{
int t = a[j - 1];
a[j - 1] = a[j];
a[j] = t;
}
}
}
双向冒泡:双向
升序:每次最大值移到后面 最小值移到前面
降序:每次最小值移到前面 最小值移到后面
//核心算法
int i, j, k;
int a[5] = { 12,31,32,1,22 };
for (i = 0; i < (N - 1)/2; i++) //双向 比较趟数减小原来的一半
{
//升序 最大移到后面
for (j = 1; j < N - i; j++)
{
if (a[j - 1] > a[j])
{
int t = a[j - 1];
a[j - 1] = a[j];
a[j] = t;
}
}
//最小移到前面
for (k = N - 1; k > i; k--)
{
if (a[k - 1] > a[k])
{
int t = a[k - 1];
a[k - 1] = a[k];
a[k] = t;
}
}
}
启发:
核心 冒泡排序 ---- 演变 双向 ---- 一题多解 ---- 围绕基础核心
拓展:选择排序双向?