数据结构--选择排序

数据结构--选择排序

简单选择排序

在待排序的数据中选出最大的(小)的元素放在其最终位置.

image-20230817171305551

简单选择排序的演示

image-20230817171454713

image-20230817171711786

简单选择排序算法

image-20230817171907085

简单选择排序算法分析

image-20230817172345023

排序方法的比较.

image-20230817172416303

堆排序

什么是堆?

堆实际上是一个完全二叉树.并且二叉树中任一非叶子结点均小于(大于)它的孩子结点.

image-20230818161524627

image-20230818161837040

第一个为大根堆

第二个为小根堆

image-20230818162130192

第一个不是堆

第二个也不是堆

如何进行堆排序?

image-20230818162317014

实现堆排序需要解决的两个问题.

image-20230818162423226

堆调整

小根堆调整

image-20230819123727246

堆的调整例题

image-20230818163547378

堆调整的算法

image-20230818163714612

堆的调整过程

image-20230818163742963

建立堆

将n/2,n/2-1,.....1的结点为根的子树均调整为堆即可.

image-20230818164141550

堆实际上是一个线性表

下面是一个建立小根堆的过程.image-20230818164355229

从最后一个非叶子结点开始,以此向前调整

image-20230818165108481

建立堆的算法实现

image-20230818165146567

堆排序的算法分析

堆排序使用完全二叉树中父节点与孩子结点之间的内在关系来排序的

image-20230818165801854

堆排序的算法实现

image-20230818165917991

堆排序的代码实现

#include <bits/stdc++.h>
using namespace std;
void HeapAdjust(int arr[], int i, int n) {
	int largest = i; //初始化为i
	int lson = i * 2 + 1;
	int rson = i * 2 + 2; //左孩子和右孩子的下标
	if (lson < n && arr[largest] < arr[lson]) {
		largest = lson;
	}
	if (rson < n && arr[largest] < arr[rson]) {
		largest = rson;
	}
	//largest是最后保存的是需要交换的下标
	if (largest != i) { //说明需要调整堆
		swap(arr[largest], arr[i]); //交换这两个元素
		HeapAdjust(arr, largest, n); //递归的向下调整堆
	}
}
int main () {
	int arr[] = {8, 3, 1, 4, 5, 6, 3, 4, 2, 100, 140, 50, 60};
	int n = sizeof(arr) / (sizeof(int));
//	cout << n << '\n';
//	for (int i = 0; i < n; i++) {
//		cout << arr[i] << ' ';
//	}
//	cout << '\n';
	for (int i = n / 2 - 1; i >= 0; i--) { //建堆
		HeapAdjust(arr, i, n);
	}
	//堆排序
	for (int i = n - 1; i > 0; i--) {
		swap(arr[0], arr[i]);
		HeapAdjust(arr, 0, i);
	}
	for (int i = 0; i < n; i++) {
		cout << arr[i] << ' ';
	}
	cout << '\n';
	return 0;
}

堆优化需要的时间不超过O(logn)

n-1次循环所需要的时间不超过O(nlogn)

image-20230818170130460

堆排序的时间复杂度总为O(nlogn)

堆排序不需要额外的空间,空间复杂度为O(1)

image-20230818170343707

posted @ 2023-08-17 17:25  harper886  阅读(19)  评论(0编辑  收藏  举报