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

学习时间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);
}
posted @ 2022-12-17 21:11  ayubene  阅读(124)  评论(0编辑  收藏  举报