本文介绍了三种常见排序算法的实现:选择排序通过遍历寻找最小值并交换;堆排序利用大顶堆结构,不断调整堆顶元素;归并排序采用分治策略,递归排序后合并有序子数组,适用于理解基础排序算法原理和实践应用。下面将详细介绍每种算法的原理和实现代码。
(一)选择排序
// 交换两个变量的值
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
// 打印数组内容
void print(int* p)
{
for (int i = 0; i < 10; i++)
{
printf("%3d", p[i]);
}
printf("\n");
}
// 选择排序算法
void section_sort(int* p, int n)
{
int i = 0; int j = 0; int min = 0;
for (i = 0; i < n; i++) // i是当前需要填充的位置
{
min = i; // 假设当前位置是最小值
// 在剩余元素中寻找最小值
for (j = i + 1; j < n; j++)
{
if (p[j] < p[min])
{
min = j; // 更新最小值位置
}
}
swap(p[i], p[min]); // 将最小值交换到当前位置
}
}
int main()
{
int arr1[10] = { 9,1,2,7,8,3,5,6,4,0 };
section_sort(arr1, 10); // 执行选择排序
print(arr1); // 打印排序结果
return 0;
}
(二)堆排
// 交换两个变量的值
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
// 调整堆结构(大顶堆)
void adjust_down(int* p, int k, int len)
{
int dad = k; // 父节点位置
int son = 2 * dad + 1; // 左子节点位置
while (son < len)
{
// 比较左右子节点,选择较大的
if (son + 1 < len && p[son] < p[son + 1])
{
son++;
}
// 如果子节点大于父节点,交换它们
if (p[son] > p[dad])
{
swap(p[son], p[dad]);
dad = son;
son = 2 * dad + 1;
}
else {
break;
}
}
}
// 打印数组内容
void print(int* p)
{
for (int i = 0; i < 10; i++)
{
printf("%3d", p[i]);
}
printf("\n");
}
// 堆排序算法
void heap_sort(int* p, int n)
{
int i = 0; int j = 0;
// 从最后一个非叶子节点开始构建大顶堆
for (i = n / 2 - 1; i >= 0; i--)
{
adjust_down(p, i, n);
}
// 将堆顶元素(最大值)与末尾元素交换
swap(p[0], p[n - 1]);
// 调整剩余元素为堆
for (j = n - 2; j > 0; j--)
{
adjust_down(p, 0, j + 1);
swap(p[0], p[j]);
}
}
int main()
{
int arr1[10] = { 9,1,2,7,8,3,5,6,4,0 };
heap_sort(arr1, 10); // 执行堆排序
print(arr1); // 打印排序结果
return 0;
}
(三)归并排序
// 交换两个变量的值
void swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
// 打印数组内容
void print(int* p)
{
for (int i = 0; i < 10; i++)
{
printf("%3d", p[i]);
}
printf("\n");
}
// 合并两个有序子数组
void merge(int* p, int low, int mid, int high)
{
static int B[10]; // 辅助数组
int k, i, j;
// 复制数据到辅助数组
for (i = low; i <= high; i++)
{
B[i] = p[i];
}
k = low;
// 比较两个子数组的元素,合并到原数组
for (i = low, j = mid + 1; i <= mid && j <= high;)
{
if (B[i] < B[j])
{
p[k++] = B[i++];
}
else {
p[k++] = B[j++];
}
}
// 复制剩余元素
while (i <= mid)
{
p[k++] = B[i++];
}
while (j <= high)
{
p[k++] = B[j++];
}
}
// 归并排序递归实现
void merge_sort(int* p, int low, int high)
{
int mid = 0;
if (low < high)
{
mid = (low + high) / 2; // 计算中间位置
merge_sort(p, low, mid); // 递归排序左半部分
merge_sort(p, mid + 1, high); // 递归排序右半部分
merge(p, low, mid, high); // 合并两个有序子数组
}
}
int main()
{
int arr1[10] = { 9,1,2,7,8,3,5,6,4,0 };
merge_sort(arr1, 0, 9); // 执行归并排序
print(arr1); // 打印排序结果
return 0;
}
1393

被折叠的 条评论
为什么被折叠?



