简单选择排序 && 堆排序

1.简单选择排序

每次从待排序队列中找到最小值,和待排序队列的第一位交换即可

//代码实现
#include<stdio.h>
#include<assert.h>

//简单选择排序(   时间复杂度O(n^2),空间复杂度O(1),不稳定的 )
void SelectSort(int arr[], int len)
{
	for (int i = 0; i < len - 1; i++)
	{
		int minindex = i;  //先认为待排序第一个值为最小值
		for (int j = i+1; j<len ; j++)
		{
			if (arr[minindex] > arr[j])
			{
				minindex = j;
			}
		}
		int tmp = arr[minindex];
		arr[minindex] = arr[i];
		arr[i] = tmp;
	}
}
//测试并打印结果
int main()
{
	int arr[] = { 3,2,5,6,78,9,0,1,45,11 };
	int n = sizeof(arr) / sizeof(arr[0]);
	SelectSort(arr, n);
	for (int i = 0; i < n; i++)
	{
		printf("%-5d", arr[i]);
	}
	return 0;
}

结果展示
在这里插入图片描述

2. 堆排序

//堆有两种:
//大顶堆:一个二叉树,父节点的值大于子节点的值
//小顶堆:一个二叉树,父节点的值小于子节点的值

//树根   深度(logn+1)  叶子结点  左孩子  右孩子  完全二叉树  满二叉树
//   父找子(父为i)       子找父(子为i(左右孩子均可为i))
//   左孩子:2*i+1        父节点为:  (i-1)/2
//   右孩子:2*i+2        

//时间复杂度为O(nlogn),空间复杂度为O(1)
#include<stdio.h>

static void HeapAdjust(int arr[], int start,int end)//调换伟大顶堆的过程
{	
	int tmp = arr[start];
	for (int i = 2 * start + 1; i <= end; i = i * 2 + 1)
	{		
		//i  左右孩子都存在
		if (i < end && arr[i] < arr[i + 1])
		{
			i++;
		}
		//ii 只有左孩子
		if (arr[i] > tmp)
		{
			arr[start] = arr[i];
			start = i;
		}
		else
		{
			break;
		}
	}
	arr[start] = tmp;
}

void HeapSort(int arr[], int len)
{
	//assert
	//2.调整为大顶堆
	for (int i = (len - 1 - 1) / 2; i >= 0; i--)//i为最后一个非叶子节点
	{
		HeapAdjust(arr, i, len - 1);
	}
	
	int tmp = 0;
	for (int j = 0; j < len - 1; j++)//j
	{
		//3.将顶部数据与最后一个节点值进行交换
		tmp = arr[0];
		arr[0] = arr[len - 1 - j];
		arr[len - 1 - j] = tmp;    

		//循环执行2.3操作
		HeapAdjust(arr, 0, (len - 1 - j) - 1);
	}
}

//测试并打印结果
int main()
{
	int arr[] = { 12,34,52,1,2,23,11,3,4,6,7,86 };
	int n = sizeof(arr) / sizeof(arr[0]);
	HeapSort(arr, n);
	for (int i = 0; i < n; i++)
	{
		printf("%-5d", arr[i]);
	}
	return 0;
}

结果展示
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值