这里简单介绍希尔排序的两种思路的代码。分别是王道课本代码 和 咸鱼学长课堂留下的作业 代码仅供参考!
- 课本代码
// 课本 希尔排序
void ShellSort(int A[], int n)
{
int d, i, j;
// A[0]只是暂存单元,不是哨兵,当J<=0时。插入位置已到
for (d = n / 2; d >= 1; d = d / 2) // 步长变化
{
for (i = d + 1; i <= n; ++i)
{
if (A[i] < A[i - d]) // 需要将A[i]插入有序增量子列表中
{
A[0] = A[i]; // 暂存在A[0]
for (j = i - d; j > 0 && A[0] < A[j]; j -= d)
{
A[j + d] = A[j]; // 记录后移,查找插入位置
}
A[j + d] = A[0]; // 插入
}
}
}
}
- 另一种思路代码
// 咸鱼学长 希尔排序
void Self_ShellSort(int A[], int n)
{
// A[0]只是暂存单元,不是哨兵,当J<=0时。插入位置已到
for (int d = n / 2; d >= 1; d = d / 2) 步长变化
{
// 从第一个元素开始,找到间隔d 的所有属于同一个子表的元素 ,进行插入排序
for (int i = 1; i <= n; ++i)
{
for (int j = i + d; j <= n; j += d)
{
int k = j - d;
if (A[j] < A[k])
{
A[0] = A[j];
for (k; k > 0 && A[0] < A[k]; k -= d)
{
A[k + d] = A[k];
}
A[k + d] = A[0];
}
}
}
}
}
- 完整代码
#include <iostream>
using namespace std;
// 课本 希尔排序
void ShellSort(int A[], int n)
{
int d, i, j;
// A[0]只是暂存单元,不是哨兵,当J<=0时。插入位置已到
for (d = n / 2; d >= 1; d = d / 2) // 步长变化
{
for (i = d + 1; i <= n; ++i)
{
if (A[i] < A[i - d]) // 需要将A[i]插入有序增量子列表中
{
A[0] = A[i]; // 暂存在A[0]
for (j = i - d; j > 0 && A[0] < A[j]; j -= d)
{
A[j + d] = A[j]; // 记录后移,查找插入位置
}
A[j + d] = A[0]; // 插入
}
}
}
}
// 咸鱼学长 希尔排序
void Self_ShellSort(int A[], int n)
{
// A[0]只是暂存单元,不是哨兵,当J<=0时。插入位置已到
for (int d = n / 2; d >= 1; d = d / 2) // 步长变化
{
// 从第一个元素开始,找到间隔d 的所有属于同一个子表的元素 ,进行插入排序
for (int i = 1; i <= n; ++i)
{
for (int j = i + d; j <= n; j += d)
{
int k = j - d;
if (A[j] < A[k])
{
A[0] = A[j];
for (k; k > 0 && A[0] < A[k]; k -= d)
{
A[k + d] = A[k];
}
A[k + d] = A[0];
}
}
}
}
}
// 输出函数
void display(int A[], int n)
{
for (int i = 1; i <= n; ++i)
{
cout << A[i] << " ";
}
cout << endl;
}
int main()
{
cout << "课本希尔排序:" << endl;
int B[] = {-1, 49, 38, 65, 87, 76, 13, 27, 49};
int N = sizeof(B) / sizeof(B[0]) - 1;
display(B, N);
ShellSort(B, N);
display(B, N);
cout << "----------------------------" << endl;
cout << "自己修改后的希尔排序:" << endl;
int A[] = {-1, 49, 38, 65, 87, 76, 13, 27, 49};
int n = sizeof(A) / sizeof(A[0]) - 1;
display(A, n);
Self_ShellSort(A, n);
display(A, n);
return 0;
}