时间复杂度和稳定性,适用性都在代码块里
简单选择排序:
#include<iostream>
using namespace std;
//选择排序 例子3 1 5 3 2 4
//适用于顺序存储和链式存储
//最好、平均和最坏都是O(n^2),不稳定的算法
int main() {
int n, i, j;
cin >> n;
//创建长度为n的数组
int *p = new int[n];
//输入数组的每一个元素的值
for (i = 0; i < n; i++)
cin >> p[i];
for (i = 0; i < n - 1; i++) {
int min = i;
for (j = i + 1; j < n; j++)
if (p[j] < p[min])
min = j;
if (min!=i)
swap(p[i], p[min]);
}
//输出数组元素
for (i = 0; i < n; i++)
cout << p[i] << " ";
cout << endl;
system("pause");
return 0;
}
堆排序:
#include<iostream>
using namespace std;
//向下调整
void AdjustDown(int *a, int k, int len)
{
//使用了哨兵
a[0] = a[k];
for (int i = 2*k; i <= len; i*=2)
{
if (i < len&&a[i] < a[i + 1])
i++;
if (a[0] >= a[i])
break;
else
{
//对双亲节点赋值
a[k] = a[i];
k = i;
}
}
a[k] = a[0];
}
//堆排序 例子3 1 5 3 2 4
//最好、平均和最坏都是O(nlogn),不稳定的算法
//大顶堆的初始化,适用顺序存储和链式存储
void BuildMaxHeap(int *a, int len)
{
for (int i = len / 2; i > 0; i--)
AdjustDown(a, i, len);
}
void HeapSort(int *a, int len)
{
BuildMaxHeap(a, len);
for (int i = len; i > 1; i--)
{
swap(a[i], a[1]);
//不断调整的节点数随i变化
AdjustDown(a, 1, i - 1);
}
}
int main() {
int n, i, j;
cin >> n;
//创建长度为n的数组
int *p = new int[n+1];
//输入数组的每一个元素的值
for (i = 1; i <= n; i++)
cin >> p[i];
HeapSort(p, n);
//输出数组元素
for (i = 1; i <= n; i++)
cout << p[i] << " ";
cout << endl;
system("pause");
return 0;
}