交换排序
一. 冒泡排序
现在我们给大家一个无序数组 要求是我们要将最大的数字放到数组最后面去
这个时候大家应该是怎么想的呢?
我们可以遍历一遍数组然后找到一个最大的值 放到最后去 (这个我们待会儿讲)
我们将这个数字和后面的数字进行比较 如果前面的数字比较大 就交换它们 如果不大于 就比较下面的数字和后面的数字 这样比较一趟 最大的数字就到最后面了
我们首先来写单趟冒泡排序的代码
1. 单趟冒泡排序
也就是将一个数字放到最后的冒泡排序
代码表示如下
for (int i = 1; i < n-j; i++)
{
if (a[i - 1] > a[i])
{
Swap(&a[i - 1], &a[i]);
}
}
我们来看看结果
2. 多趟排序
我们想想看 既然每次排序能够将最大的数字放到最后去
我们是不是可以在经过(x-1)次排序之后将x个数字排序完成啊
既然如此 我们开始实现完全体的冒泡排序
代码表示如下
void BubbleSort(int* a, int n)
{
for (int j = 0; j < n; j++)
{
//单趟
bool exchange = false;
for (int i = 1; i < n-j; i++)
{
if (a[i - 1] > a[i])
{
Swap(&a[i - 1], &a[i]);
exchange = true;
}
}
if (exchange == false)
{
break;
}
}
}
还是一样我们来看看效果怎么样
可以完美运行
二. 快速排序
这个排序很难 并且会有很多变形
所以我会用单独的一篇博客来介绍
介绍完之后会将连接贴到这篇博客里面
选择排序
一. 选择排序
1. 单趟选择排序
还记不记得我们上面讲的一句话
我们这里设定只要设定一个最大值 依次遍历整个数组 并且在最后将这个最大值放到数字后面就可以
代码表示如下
for (int i = left + 1; i <= right; i++)
{
if (a[i] < a[mini])
{
mini = i;
}
if (a[i] > a[maxi])
{
maxi = i;
}
}
//交换
Swap(&a[left], &a[mini]);
//如果left和maxi重叠,交换修正
if (left == maxi)
{
maxi = mini;
}
Swap(&a[right], &a[maxi]);
2. 完整选择排序
跟冒泡排序的思想及其相似
使用i控制排序的次数
使用j来控制每次排序
整体代码如下
//选择排序
void Swap(int* p1, int* p2)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
void SelectSort(int* a, int n)
{
//单趟遍历一遍 找最大最小值
//最大值放左边 最小值放右边
int left = 0;
int right = n - 1;
//初始化最大最小值
int mini = left; int maxi = left;
while (left < right)
{
//找出最大最小
for (int i = left + 1; i <= right; i++)
{
if (a[i] < a[mini])
{
mini = i;
}
if (a[i] > a[maxi])
{
maxi = i;
}
}
//交换
Swap(&a[left], &a[mini]);
//如果left和maxi重叠,交换修正
if (left == maxi)
{
maxi = mini;
}
Swap(&a[right], &a[maxi]);
left++;
right--;
}
}
运行结果如下:
二. 堆排序
堆排序已经在前面的博客中介绍了
这里我们直接上代码
//堆排序
//向下调整
void AdjustDown(int* a, int n, int parent)
{
int child = parent * 2 + 1;
while (child < n)
{
//找出左右孩子大的那个
if (child+1<n && a[child + 1]>a[child])
{
child++;
}
if (a[child] > a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
//更新孩子的位置
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void HeapSort(int* a, int n)
{
//向下调整建堆
for (int i = (n - 1 - 1) / 2; i > 0; i--)
{
AdjustDown(a, n, i);
}
int end = n - 1;
while (end > 0)
{
Swap(&a[end], &a[0]);
AdjustDown(a, end, 0);
end--;
}
}
以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言