选择排序
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 —百度百科
实现代码
#include<iostream>
#include<string>
#include<stack>
#include<algorithm>
using namespace std;
void selectSort(int a[], int len) {
//直接选择排序
for (int i = 0; i < len; i++) {
int pos = i;
for (int j = i + 1; j < len; j++) {
if (a[pos] > a[j]) pos = j;//找最小值
}
if (pos != i) swap(a[i], a[pos]);
}
}
int main() {
int a[10];
for (int i = 0; i < 10; i++) cin >> a[i];
selectSort(a, end(a) - begin(a));
for (int i = 0; i < 10; i++) cout << a[i] << " ";
cout << endl;
return 0;
}
//样例: 5 1 4 2 6 9 3 8 7 0
堆排序
堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 —百度百科
实现代码
#include<iostream>
#include<string>
#include<stack>
#include<algorithm>
using namespace std;
void sifi(int a[], int L, int R) {
//调整大根堆
int i = L, j = 2 * i;
int temp = a[i];//从根结点出发
while (j <= R) {
if (j < R && a[j] < a[j + 1]) ++j;//判断是左孩子大还是右孩子大
if (temp < a[j]) {
a[i] = a[j];//用较大的孩子去替代根结点
i = j; //继续往下调整
j = 2 * i;
}
else break;
}
a[i] = temp;//到达叶子结点,调整结束
}
void heapSort(int a[], int len) {
//堆排序 从小到大排序
for (int i = len / 2; i >= 1; i--) sifi(a, i, len);//构建大根堆
for (int i = len; i >= 2; i--) {
//归位
swap(a[i], a[1]);
sifi(a, 1, i - 1);
}
}
int main() {
int a[12];
for (int i = 1; i <= 10; i++) cin >> a[i];
heapSort(a,10);
for (int i = 1; i <= 10; i++) cout << a[i] << " ";
cout << endl;
return 0;
}
//样例: 5 1 4 2 6 9 3 8 7 0