C++选择排序(直接选择/堆排序)

选择排序

选择排序(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

猜你喜欢

转载自blog.csdn.net/buibuilili/article/details/108024279
今日推荐