首页 > 其他分享 >选择排序(简单选择排序,堆排序)

选择排序(简单选择排序,堆排序)

时间:2022-12-17 21:22:15浏览次数:52  
标签:parent int ElemType 堆排序 elem ST 选择 排序

学习时间2022.12.17

选择排序

基本概念

简单选择排序

  • 第1次,遍历整个数组,找到最小的数字,将其与第一位进行调换;第2次,遍历除以排序好的第1个数,遍历后面所有数字,找到最小的,与第2位进行调换...以此类推

堆排序

  • 要理解堆排序,可以看看这个代码菜鸟教程堆排序和这个动画演示David Galles Computer Science University of San Francisco-Data Structure Visualizations-Heap Sort
  • 以下来自wikipedia-heapsort
  • 堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。
  • 若以升序排序说明,把数组转换成最大堆(Max-Heap Heap),这是一种满足最大堆性质(Max-Heap Property)的二叉树:对于除了根之外的每个节点i, A[parent(i)] ≥ A[i]。
  • 重复从最大堆取出数值最大的结点(把根结点和最后一个结点交换,把交换后的最后一个结点移出堆),并让残余的堆维持最大堆性质。

代码实现

基本数据结构

typedef int ElemType;

typedef struct {
	ElemType* elem;//整型指针
	int TableLen;//动态数组元素个数
}SSTable;

基本函数实现

void ST_init(SSTable& ST, int len) {
	ST.TableLen = len;
	//ST.elem = (ElemType*)malloc(sizeof(ElemType) * ST.TableLen);
	ST.elem = (ElemType*)calloc(ST.TableLen, sizeof(ElemType));
	//初始化随机数发生器
	srand(time(NULL));
	//输出0-100的ST.TableLen个随机数
	for (int i = 0; i < ST.TableLen; i++)
	{
		ST.elem[i] = rand() % 100;
	}
}

void swap(ElemType& a, ElemType& b) {
	int temp;
	temp = a;
	a = b;
	b = temp;
}

void ST_print(SSTable ST) {
	for (int i = 0; i < ST.TableLen; i++) {
		printf("%3d", ST.elem[i]);
	}
	printf("\n");
}

简单选择排序和对应main函数

//简单选择排序
void SelectSort(ElemType A[], int n) {
	int i, j, min;
	for (i = 0; i < n - 1; i++)
	{
		min = i;
		for (j = i + 1; j < n; j++)
		{
			if (A[min] > A[j])
			{
				min = j;
			}
		}
		swap(A[i], A[min]);
	}
}

int main() {
	SSTable ST;
	ST_init(ST, 10);
	ElemType A[] = { 32,45,11,324,32,59,90,85,1,49 };
	//memcpy(ST.elem, A, sizeof(A));
	ST_print(ST);
	SelectSort(ST.elem, 10);
	ST_print(ST);
}

堆排序和对应main函数

//最大堆积
void MaxHeapify(ElemType A[], int begin, int end) {
	int parent, child;
	parent = begin;
	child = parent * 2 + 1;
	while (child <= end)
	{
		if (child + 1 <= end && A[child] < A[child + 1])
		{
			child += 1;
		}
		if (A[child] > A[parent])
		{
			swap(A[child], A[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			return;
		}
	}
}

//堆排序
void HeapSort(ElemType A[], int n) {
	for (int i = n / 2 - 1; i >= 0; i--)
	{
		MaxHeapify(A, i, n - 1);
	}
	for (int j = n - 1; j > 0; j--)
	{
		swap(A[0], A[j]);
		MaxHeapify(A, 0, j - 1);
	}
}

int main() {
	SSTable ST;
	ST_init(ST, 10);
	ElemType A[] = { 32,45,11,324,32,59,90,85,1,49 };
	//memcpy(ST.elem, A, sizeof(A));
	ST_print(ST);
	HeapSort(ST.elem, 10);
	ST_print(ST);
}

标签:parent,int,ElemType,堆排序,elem,ST,选择,排序
From: https://www.cnblogs.com/ayubene/p/16989555.html

相关文章

  • [机器学习] Yellowbrick使用笔记2-模型选择
    在本教程中,我们将查看各种ScikitLearn模型的分数,并使用Yellowbrick的可视化诊断工具对它们进行比较,以便为我们的数据选择最佳的模型。​​代码下载​​文章目录​​1使用......
  • [机器学习] 特征选择笔记3-递归式特征消除
    特征选择​​​代码下载​​​本文主要介绍sklearn中进行特征选择的方法。​​sklearn.feature_selection​​模块中的类可用于样本集的特征选择/降维,以提高估计量的准确性......
  • [机器学习] 特征选择笔记4-使用SelectFromModel特征选择
    特征选择​​​代码下载​​​本文主要介绍sklearn中进行特征选择的方法。​​sklearn.feature_selection​​模块中的类可用于样本集的特征选择/降维,以提高估计量的准确性......
  • [机器学习] 特征选择笔记2-单变量特征选择
    特征选择​​​代码下载​​​本文主要介绍sklearn中进行特征选择的方法。​​sklearn.feature_selection​​模块中的类可用于样本集的特征选择/降维,以提高估计量的准确性......
  • 计算机网络(自顶向下)学习笔记)——路由选择算法
    第五章—路由选择算法5.1、路由的概念路由:按照某种指标(传输延迟,所经过的站点数目等)找到一条从源节点到目标节点的较好路径较好路径:按照某种指标较小的路径指标:......
  • java数据结构与算法(day2)--简单排序
    模式:设计api实现api简单排序举例(商品排序)1.1Comparable接口介绍(排序算法更有通用性:对象排序)创建对象,并且生成豆子。创建Comparable接口1packagecn.itcast.algor......
  • 插入排序(直接插入,折半插入,希尔排序)
    学习时间2022.12.17插入排序基本概念直接插入排序要理解直接插入排序看这篇解学武插入排序算法及C语言实现将第一待排序序列第一个元素看做一个有序序列,把第二个元素......
  • 数组或者集合的选择
    想展示菜单,先找一个容器把所有的菜存起来,用户查看的时候直接展示。集合数组都是容器,但是数组的长度不好变化,集合更方便。定义集合表示饭店拥有的菜品。循环输出集合元素点的......
  • 第二十章《Java Swing》第8节:选择器
    在Swing体系中有文件选择器和颜色选择器,它们分别用来帮助用户选择文件和颜色,这些选择操作是可视化桌面应用程序常用的操作,本小节将详细讲解这两种选择器的使用方式。20.8.1......
  • 数据结构之 插入排序
    插入排序:包括:​​直接插入排序​​,二分插入排序(又称折半插入排序),链表插入排序,​​希尔排序​​(又称缩小增量排序)。插入排序算法思路假定这个​​数组​​的序是排好的,......