OJ每日一练试水第6天,聊聊排序的问题

时间:2019年7月8日

排序算法

在这里插入图片描述
在这里插入图片描述

堆排序

在这里插入图片描述
堆是树的一种特殊形式

1.要满足完全二叉树(定义要知道吧) 儿子要从左边开始
在这里插入图片描述
像这样的就不满足!
2.父节点的值要大于子节点
在这里插入图片描述
heapify(将树变成堆的过程)

关于完全二叉树的一些性质
在这里插入图片描述
对于此树 进行堆排序
在这里插入图片描述

#include<stdio.h>
void swap(int tree[],int n,int i)
{
	int temp=tree[n];
	tree[n]=tree[i];
	tree[i]=temp;
}
//n表示树的结点总个数 i表示当前的结点位置 
void heapify(int tree[],int n,int i)
{
	if(i>=n){
		return ;
	}
	int c1= 2*i+1;
	int c2= 2*i+2;
	int max=i;   //max表示最大值的结点位置 
	if(c1<n && tree[max]<tree[c1]) 
	{
		max=c1;
	}
	if(c2<n && tree[max]<tree[c2])
	{
		max=c2;
	}
//	(tree[max]<tree[c1])?(c1):(tree[max]<tree[c2])?max=c2:max=max;
	if(max!=i)  //说明i指的不是树的最大值 
	{
		swap(tree,max,i);
		heapify(tree,n,max);
	}
}
int main()
{
	int tree[]={4,10,3,5,1,2};
	int n=6;
	heapify(tree,n,0);
	for(int i=0;i<n;i++)
	{
		printf("%d\n",tree[i]); 
	}
	
	return 0;
} 

打印的结果
在这里插入图片描述

在这里插入图片描述

#include<stdio.h>
//数组中要交换数据 可以通过交换其结点坐标来实现 
void swap(int tree[],int n,int i)
{
	int temp=tree[n];
	tree[n]=tree[i];
	tree[i]=temp;
}
//heapify 把一颗普通树变成堆(堆中的第一个结点的值是最大的) 
//n表示树的结点总个数 i表示当前的结点位置 
void heapify(int tree[],int n,int i)
{
	if(i>=n){
		return ;
	}
	int c1= 2*i+1;
	int c2= 2*i+2;
	int max=i;   //max表示最大值的结点位置 
	if(c1<n && tree[max]<tree[c1]) 
	{
		max=c1;
	}
	if(c2<n && tree[max]<tree[c2])
	{
		max=c2;
	}
	if(max!=i)  //说明i指的不是树的最大值 
	{
		swap(tree,max,i);
		heapify(tree,n,max);
	}
	
}
void build_heap(int tree[],int n) 
{
	int last_node = n-1;
	int parent = (last_node - 1)/2;
	int i;
	for(i=parent;i>=0;i--)
	{
		heapify(tree,n,i);
	}
}
void heap_sort(int tree[],int n)
{
	build_heap(tree,n);
	int i;
	for(i=n-1;i>=0;i--)
	{
		swap(tree,i,0);//将第一个结点和最后一个结点进行交换
	 	heapify(tree,i,0);
	}
}
int main()
{
	int tree[]={4,10,3,5,1,2};
	int n=6;
/*	heapify(tree,n,0);
	*/
	heap_sort(tree,n);
	for(int i=0;i<n;i++)
	{
		printf("%d\n",tree[i]); 
	}
	return 0;
} 

在这里插入图片描述
大概的流程
在这里插入图片描述

快速排序

在时间上比冒泡排序好,在空间上比桶排序好
平均时间复杂度为O(NlogN)
在这里插入图片描述
代码:

#include<stdio.h>
int arr[]={2,5,1,6,3};
int a[]={2,5,1,6,3};
int len=5;
void quick_sort(int left,int right)  //本人习惯让最后一个数作为基准数
{
	if(left>right)
	{
		return ;
	}
	int i=left;
	int j=right;
	int index=arr[right];
	int temp;
	while(i!=j)
	{
		while(arr[i]<=index&&i<j){
		i++;
		}
		while(arr[j]>=index&&i<j){
		j--;
		}
		if(i<j)
		{
			temp=arr[i];
			arr[i]=arr[j];
			arr[j]=temp;
		} 
	}
	arr[right]=arr[i];
	arr[i]=index;
	
	quick_sort(left,i-1);
 	quick_sort(i+1,right);
}
void quicksort(int left,int right)
{
	 int i,j,t,temp;
	 if(left>right)
	 return;

	 temp=a[left]; //temp中存的就是基准数
	 i=left;
	 j=right;
	 while(i!=j)
	 {
		 //顺序很重要,要先从右往左找
		 while(a[j]>=temp && i<j)
		 j--;
		 //再从左往右找
		 while(a[i]<=temp && i<j)
		 i++;
		 //交换两个数在数组中的位置
		 if(i<j)//当哨兵i和哨兵j没有相遇时
		 {
		 t=a[i];
		 a[i]=a[j];
		 a[j]=t;
 		 }
 	 }
	 //最终将基准数归位 
	 a[left]=a[i];
	 a[i]=temp;
	
	 quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
	 quicksort(i+1,right);//继续处理右边的,这里是一个递归的过程
} 
int main()
{
	quick_sort(0,len-1);
	for(int i=0;i<len;i++)
	{
		printf("%d ",arr[i]);
	}
	quicksort(0,len-1);
	printf("\n");
	for(int i=0;i<len;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
} 

在这里插入图片描述

归并排序

#include<stdio.h>
int arr[]={2,8,9,10,4,5,6,7};
int m=4;
int l=0;
int r=7;
int min(int n,int m)
{
	return (n<=m)?n:m;
}
void merge(int m,int l,int r)
{
	int left_size=m-l;
	int right_size=r-m+1;
	int left[left_size];
	int right[right_size];
	int i,j,k;
	//填充左边的数组 
	for(i=l;i<m;i++)
	{
		left[i-l]=arr[i];
	}
	//填充右边的数组
	for(i=m;i<=r;i++)
	{
		right[i-m]=arr[i];
	} 
	//合并到原来的数组
	i=0;
	j=0; k=0;
	while(i<left_size&&j<right_size)
	{
		if(left[i]<=right[j]){
			arr[k]=left[i];
				i++;k++;
			}else{
			arr[k]=right[j];
				j++;k++;
			}
	}
	while(i<left_size)
	{
		arr[k]=left[i];
		i++;k++;
	} 
	while(j<right_size)
	{
		arr[k]=right[i];
		j++;k++;
	}
	
}
int main()
{
	merge(m,l,r);
	for(int i=0;i<=r;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
} 
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、资源1项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑瞳丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值