//冒泡
void sort_bubble(int* p, int n)
{
for (int i = n - 1; i > 0; --i)
{
for (int j = 0; j < i; ++j)
{
if (p[j] < p[j + 1])
{
int b = p[j];
p[j] = p[j + 1];
p[j + 1] = b;
}
}
}
}
//选择
void sort_select(int* p, int n)
{
for (int i = 0; i < n - 1; ++i)
{
int j = i;
for (int k = j + 1; k < n; ++k)
{
if (p[k] > p[j])
j = k;
}
if (j != i)
{
int b = p[j];
p[j] = p[i];
p[i] = b;
}
}
}
//插入
void sort_insert(int* p, int n)
{
for (int i = 0; i < n - 1; ++i)
{
//将p[i + 1]位置的数据插入到
//p[0]~p[i]的排序数据组
int j;
for (j = 0; j <= i; ++j)
{
if (p[i + 1] < p[j])
break;
}
//如果p[i + 1]比p[0]~[i]的所有元素都大
//那么这j最后是等于i + 1跳出的,如果j
//等于i + 1则不进行插入
if (j != i + 1)
{
//得到插入的数据
int b = p[i + 1];
//得到要移动的次数
int m = i + 1 - j;
//插入
for (int k = 0; k < m; ++k)
p[i + 1 - k] = p[i - k];
p[j] = b;
}
}
}
//快速排序
void sort_quick(int* p, int b, int e)
{
//快速排序有两个步骤
//1)将当前数组的最左侧的元素放在该放的位置,
//就是把当前数组中比最左侧小的元素放在它的
//左边,比最左侧大的元素放在它的右边
if (b >= e)
return;
//用i下标标记当前要放入的比p[b]小的元素的位置
int i = b;
//循环调整
for (int j = b + 1; j <= e; ++j)
{
if (p[j] < p[b])
{
i += 1;
if (i != j)
{
int c = p[j];
p[j] = p[i];
p[i] = c;
}
}
}
if (i != b)
{
int c = p[b];
p[b] = p[i];
p[i] = c;
}
//2)把i左侧的部分和右侧的部分分别进行
//递归处理
sort_quick(p, b, i - 1);
sort_quick(p, i + 1, e);
}
//归并
void sort_merge(int* p, int b, int e, int* h)
{
if (b >= e)
return;
//得到b、e的中间位置
int m = (b + e) / 2;
//递归左边的
sort_merge(p, b, m, h);
//递归右边的
sort_merge(p, m + 1, e, h);
//归并
int i1 = b, i2 = m + 1, i3 = b;
while (i1 <= m && i2 <= e)
{
if (p[i1] < p[i2])
h[i3++] = p[i1++];
else
h[i3++] = p[i2++];
}
while (i1 <= m)
h[i3++] = p[i1++];
while (i2 <= e)
h[i3++] = p[i2++];
for (int i = b; i <= e; ++i)
p[i] = h[i];
}