Zero.基础代码
主函数部分
-
代码
void solve()
{
int a[MAX], n;
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
InsertSort(a, n);
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
}
int main()
{
solve();
return 0;
}
First.直接插入排序
- 对数组进行主遍历,寻找非顺序元素;
- 标记非顺序元素,对该元素之前的所有元素进行次级遍历,并进行比较,如果大于标记元素则将该元素后移,否则将标记元素置于该元素之后;
- 重复1.步骤直到主遍历到达数组末尾,结束;
-
代码
void InsertSort(int a[], int n)//InserSort Code Core
{
for (int i = 0; i < n - 1; i++)
{
if (a[i + 1] < a[i])
{
int x = a[i + 1];
int j = i;
while (x < a[j])
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = x;
}
}
}
Second.希尔排序
- 取一个增量为数组长度的一半;
- 以该增量为步长,对数组进行进行主遍历,寻找非顺序元素;
- 标记非顺序元素,对该元素之前且步长可达的所有元素进行次级遍历,并进行比较,如果大于标记元素则将该元素后移至一步之后,否则将标记元素置于该元素之后一步的地方(“一步”意味距离一步长的位置);
- 重复2.步骤直到主遍历到达数组末尾;
- 令新增量为原增量一半,重复1.2.3.步骤直到增量为0,结束;
-
代码
void ShellInsert(int a[], int n, int ad)//Like InsertSort
{
for (int i = 0; i < n - ad; i++)
{
if (a[i + ad] < a[i])
{
int x = a[i + ad];
int j = i;
while (x < a[j])
{
a[j + ad] = a[j];
j -= ad;
}
a[j + ad] = x;
}
}
}
void ShellSort(int a[], int n)//ShellSort Code Core
{
int ad = n / 2;
while (ad)
{
ShellInsert(a, n, ad);
ad /= 2;
}
}
Third.选择排序
- 对数组进行主遍历,对每一个元素进行操作;
- 对该元素之后的所有元素进行遍历,并标记这些元素中的最大元素;
- 交换主遍历访问的元素和标记元素;
- 重复1.2.步骤直到主遍历到达数组末尾,结束;
-
代码
void SelectSort(int a[], int n)//SelectSort Code Core
{
for (int i = 0; i < n;i++)
{
int index = i;
int min = a[i];
for (int j = i + 1; j < n;j++)
{
if (a[j] < min)
{
min = a[j];
index = j;
}
}
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
网友评论