经典算法(七)----堆排序----图解法让你快速入门

11 篇文章 19 订阅
订阅专栏

引言

          相对于其他的排序算法,堆排序可以说算数比较难理解的,而且学习堆排序之前排序提前学习堆的定义。

          不过不用担心,这篇文章会用通俗易懂的方式让你尽可能的学会堆排序!!!

本文将从以下几个问题对堆排序进行分析和讲解:

  1. 预备知识:堆是什么?
  2. 堆排序是什么?(★重要★)
  3. 堆排序的具体过程是什么?(★★★重要★★★)
  4. 堆排序的代码实现。
  5. 堆排序的代码详解。

一、堆是什么?

说起堆,不得不的说起二叉树。先看二叉树的定义

百度百科的二叉树定义:

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分   。

简单来说,二叉树就是每个结点能分出两个叉(所以叫二叉树)。下面看一个二叉树的图。

二叉树的几个名词,就拿结点B来说,结点A是结点B的双亲结点,结点D是结点B的子结点(左)。

叶子结点点是指没有孩子结点的结点,上图的G,E,H都是叶子结点

其实堆就是和二叉树有关,下面看图

上面这个图可以看出来,不论哪个结点,它的子结点都比他小(叶子结点除外);不论哪个结点,它的双亲结点都比他大(根结点除外)

所以上面的这个又叫大顶堆(最大的数在最上面),大顶堆是用来解决从小到大排序的(注意),本文讲解的就是从小到大排序。

上面这个图可以看出来,不论哪个结点,它的孩子结点都比他大(叶子结点除外);不论哪个结点,它的双亲结点都比他小(根结点出外)

所以上面的这个又叫小顶堆(最小的数在最上面),小顶堆是用来解决从大到小排序的(注意)。

注意看上图的角标,它的编号方式就是从上到下,从左到右,依次递增,如果有缺的的也算数(比如角标为2的结点就有没有右孩子,但是它的右孩子角标就是5)。

重要结论:

上面的角标存在一个关系;对某个角标为 i 的结点  。如果存在左孩子右孩子,那么它的角标分别是 2*i 2*i+1 

如果他的双亲结点存在,那么他的双亲结点的角标就是 i/2

截止到现在为止,必须要理解什么是大顶堆,什么是小顶堆,对于某个结点,他和他的双亲结点、孩子结点有什么关系。

二、什么是堆排序?

说起堆排序,我们目标就是对给定的数组进行排序,这个排序方法采取堆的形式进行。所有我们堆排序分以下几步:

  1. 把我们要排序的数组构造成一个大顶堆(从小到大排序),这里要注意,我们一开始有一个数组,数组有下标,这里的下标就和我们的角标一样。所以我们如果一旦有了一个数组,其实就有了一个堆,只不过这个对可能不满足最大堆或者最小堆的情况。假如我们要排序的数组是20,30,50,40,10,70,60,80,那我们就有下面这个堆。
  2. 既然我们要对这个数组从小到大排序,那就把现有的堆变成大顶堆(至于为啥是大顶堆后面说)。
  3. 变成大顶堆之后,堆定元素就是最大值,再把这个最大值和这个数组的最后一个元素交换位置,这样一来数组的最大值就放到了数组的尾部。再看这个堆(这时候这个堆不包括数组的最后一个元素了),这时候堆就不是最大堆了,又把这个堆需要变成最大堆,等变成最大堆之后,再把堆顶元素放到数组的倒数第二个位置。
  4. 重复上面的操作,就可以实现数组的从小到大排序了。
  5. 如果采取的是小顶堆,那么每次是把最小的数放到数组后面,重复这个操作,就可以实现从大到小排序了

三、堆排序的具体过程是什么?

在概括一下上面说的堆排序的步骤,其实就分两大步:

  1. 第一步,把这个堆变成大顶堆
  2. 第二步,把最大元素放到数组尾部,再重复第一步

下面先看第一步,假设我们要排序的数组为 20,30,50,40,10,70,60,80。(为了方便,数组下标从1开始)

上面是我们要排序的数组,下面是数组对应的堆。既然要变成大顶堆,就要最大的数移动到顶部,

那我们的一个堆怎样变成大顶堆呢,那我们就可以从根结点开始遍历,如果这个根结点的左孩子和右孩子有比根结点大的,那就选择一个较大的孩子,和这个根结点交换值,这样就达到较大的值在根部了。

上面的根结点函数就是可以把一个结点的值和他的孩子结点比较,如果孩子结点大于他,然后交换值。但是他有限制,他只能和他的孩子结点交换,并不能和他孩子结点的孩子结点交换, 所以通过调用这一个函数并不能直接把一个任意的堆变成大顶堆,这个函数能实现的功能就是把某个结点和他的对应的孩子结点交换,如果交换成功,孩子结点还可以和孩子的孩子结点交换,达到一个下沉的效果。下面看这个函数代码:

void HeapAdjust(int arr[],int first,int last)
{
	int temp=arr[first];//暂存“根”结点 
	int j;//子结点 
	for(j=2*first;j<=last;j=j*2)
	{
		//下面if语句的作用是找出子结点中比较大的那个 
		//j是左节点,j+1是右节点,
		//如果右节点大,那j+1就可以了,如果左节点大那就不用+1
		//执行完下面的语句,j下标是较大的那个子结点的下标 
		if(j<last &&arr[j]<arr[j+1])
			j++;
		
		//下面if语句的作用是如果“根”结点大于子结点,
		//结束查找即可
		if(temp>arr[j])
			break; 
		
		//理解下面两条语句可以类比插入排序,
		//还记得插入排序中的元素后移吗? 这里是“下移” 
		arr[first]=arr[j];
		first=j; //如果下移,记录对应的下标,方便下次下移 
	}
	//同样类比插入排序,把要插入的元素,放到合适的位置 
        //不过这个first会在循环中会更新
	arr[first]=temp; 
} 

截止到现在为止,我们要知道这个函数的功能,更要知道这个函数的限制(不能直接把任意一个堆变成大顶堆)。

上面的所有就是实现大顶堆的函数,但是它并不能完成实现大顶堆,下面看第二步

第二步也是写一个函数来实现把最大元素放到数组尾部,重复第一步,但是这执行把最大元素放到数组尾部的时候,要处理第一步留下的问题。

 


 

解决办法:

我们首先看上面的图,我们函数的功能是可以交换一个结点和他的孩子结点的值,那么我们再看上图的所有绿色的叶子结点。

如果我们从这些绿色的叶子结点的根结点(也可说上图的非叶子结点,白色的圆圈)都使用一遍那个函数(从角标大的开始,因为角标大的可能作为角标小的孩子结点),那么我们是不是就可以实现从任意一个堆到大顶堆的转换了。

比如从角标为4的叶子结点使用大顶堆函数,那么40就会和80互换位置,

再对角标为2和角标3(他的两个孩子结点是80和10,而不是交换之前的40和10)的结点使用大顶堆函数,那50就会和70(70比60大,选择孩子结点中较大的)交换位置,20和80交换位置

再对角标为1的结点使用大顶堆函数,20就会和80交换位置。

经过上面的步骤就实现了堆向大顶堆转换(注意大顶堆的顶部最大,对其他位置没有要求)。 

上面的步骤就可以用下面的三行代码实现。(注意是从非叶子结点的角标最大值开始,往角标小的遍历)

注意,上面的非叶子结点的角标最大值是数值最后一个元素角标除以2得到的。遍历下面代码即可。

for(int i=len/2;i>0;i--)
{
		HeapAdjust(arr,i,len);
}
 

 

下面就需要把大顶堆的元素和这棵树的最后一个元素交换位置就可了,等到交换完位置,这时候这个堆就不是大顶堆了,然后调用一次大顶堆函数,就又可以把大顶堆变换出来了(想想为啥这时候调用一个函数就可以,初始的堆调 函数为啥就不可以变成大顶堆),下面看代码

void HeapSort(int arr[],int len) 
{
	for(int i=len/2;i>0;i--)//把堆变成大顶堆
	{
		HeapAdjust(arr,i,len);
	}


	for(int i=len;i>0;i--)//需要交换几次位置的次数 
	{
		//下面三行的代码是把堆顶最大的元素和堆尾最后一个元素换位置
		//这样一来,最大元素就在数组尾部了,
		//因此大顶堆 是用来从小 到大排序的 
		int temp=arr[1];
		arr[1]=arr[i];
		arr[i]=temp;
		
		//对堆剩下的元素继续排序。 
		HeapAdjust(arr,1,i-1);
	}
}

四、堆排序的代码实现

下面看完整的代码

#include<iostream>
using namespace std;
//堆排序函数    稳定 

void HeapAdjust(int arr[],int first,int last)
{
	int temp=arr[first];//暂存“根”结点 
	int j;//子结点 
	for(j=2*first;j<=last;j=j*2)
	{
		//下面if语句的作用是找出子结点中比较大的那个 
		//j是左节点,j+1是右节点,
		//如果右节点大,那j+1就可以了,如果左节点大那就不用+1
		//执行完下面的语句,j下标是较大的那个子结点的下标 
		if(j<last &&arr[j]<arr[j+1])
			j++;
		
		//下面if语句的作用是如果“根”结点大于子结点,
		//结束查找即可
		if(temp>arr[j])
			break; 
		
		//理解下面两条语句可以类比插入排序,
		//还记得插入排序中的元素后移吗? 这里是“下移” 
		arr[first]=arr[j];
		first=j; //如果下移,记录对应的下标,方便下次下移 
	}
	//同样类比插入排序,把要插入的元素,放到合适的位置 
	arr[first]=temp; 
} 

void HeapSort(int arr[],int len) 
{
	for(int i=len/2;i>0;i--)
	{
		HeapAdjust(arr,i,len);
	}
	for(int i=len;i>0;i--)//需要交换几次位置的次数 
	{
		//下面三行的代码是把堆顶最大的元素和堆尾最后一个元素换位置
		//这样一来,最大元素就在数组尾部了,
		//因此大顶堆 是用来从小 到大排序的 
		int temp=arr[1];
		arr[1]=arr[i];
		arr[i]=temp;
		
		//对堆剩下的元素继续排序。 
		HeapAdjust(arr,1,i-1);
	}
}


//输出数组的值
void printf(int arr[],int len)
{
	for(int i=1;i<=len;i++)
		cout<<arr[i]<<" ";
	cout<<endl;
}
int main()
{
	//要排序的数组 ,为了方便理解,数组下标从1开始 
	int arr[]={0,3, 44,38, 5,47,15,36,26,27,2 ,46,4 ,19,50,48};
	int len=15;//要排序的数组长度 
	
	//排序 
	HeapSort(arr,len);
	
	//输出 
	printf(arr,len);
	return 0;
}

运行结果:

五、堆排序的代码详解

  1. 首先是要了解转换大顶堆的函数,在符合条件的情况下,他是一个可以把根结点逐渐下称的过程。并不能可以把随便一个堆变成大顶堆
  2. 懂得怎样把随便一个堆变成大顶堆
  3. 交换堆顶元素和堆的最后一个元素,在调用大顶堆函数

本文参考以及引用:

百度百科

 

如果对其他的算法还有兴趣,可以点击下面的链接。

  1. 经典算法(一)----冒泡排序----图解法让你快速入门

  2. 经典算法(二)----选择排序----图解法让你快速入门

  3. 经典算法(三)----插入排序----图解法让你快速入门

  4. 经典算法(四)----希尔排序----图解法让你快速入门

  5. 经典算法(五)----归并排序----图解法让你快速入门

  6. 经典算法(六)----快速排序----图解法让你快速入门

  7. 经典算法(七)----  堆排序 ----图解法让你快速入门

  8. 经典算法(八)----计数排序----图解法让你快速入门

  9. 经典算法(九)----基数排序----图解法让你快速入门

  10. 经典算法(十)----  桶排序  ----图解法让你快速入门

 

创作不易,如果本文对你起到了一些帮助,何不点个赞再走呢!!!

 

C#-基于C#实现的选择排序算法-Selection-Sort.zip
03-09
C#_基于C#实现的选择排序算法_Selection-Sort
C的数据结构八种排序算法的-代码及分析.docx
11-29
C的数据结构八种排序算法的-代码及分析.docx
图解堆排序
weixin_30284355的博客
04-10 329
摘要: 作为选择排序的改进版,堆排序可以把每一趟元素的比较结果保存下来,以便我们在选择最小/大元素时对已经比较过的元素做出相应的调整。 堆排序是一种树形选择排序,在排序过程中可以把元素看成是一颗完全二叉树,每个节点都大(小)于它的两个子节点,当每个节点都大于等于它的两个子节点时,就称为大顶堆,也叫堆有序;当每个节点都小于等于它的两个子节点时,就称为小顶堆。 ...
精通八大排序算法系列:二、堆排序算法
dinongxu8804的博客
02-21 272
精通八大排序算法系列:二、堆排序算法 作者:July 、二零一一年二月二十日本文参考:Introduction To Algorithms,second edition。------------------- 此精通排序算法系列,前一节,已讲过了一、快速排序算法,其中,快速排序每一趟比较用时O(n),要进行lgn次比较,才最终完成整个排序。所...
快速排序、堆排序
Cheny的博客
05-09 105
//快速排序 /* 1. 选取Pivot作为中心轴,这个是随便选择的 2. 将大于Pivot的数字放在Pivot的右边 3. 将小于Pivot的数字发那个在Pivot的左边 4. 分别对左右子序列重复前三个步骤 */ class Solution { Random random = new Random(); public int findKthLargest(int[] nums, int k) { return quickSelect(nums, 0, nums.len
堆排序快速排序
weixin_30216561的博客
04-24 71
大根堆排序算法的基本操作: ① 初始化操作:将R[1..n]构造为初始堆; ② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。 注意: ①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。 ②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序...
堆排序-快速排序
u011647020的博客
11-02 291
堆排序   堆排序是利用堆这种数据结构而设计的一种排序算法堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。 堆   堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为最大堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为最小堆 堆排序基本思想及步骤: 堆排序的基本思想是:将待排序序列...
堆排序快速排序
墨痕诉清风的博客
03-21 265
时间复杂度一样的都是O(nlog2 n),但貌似堆排序用到的空间比快速排序少(只要一个),那么为什么好像快速排序的应用比堆排序多? 堆排序 #include <iostream> using namespace std; void Swap(int & left_data, int & right_data) { int auxiliary...
网游服务端开发入门知识 - 游戏开发游戏npc算法.pdf
04-18
网游服务端开发入门知识 - 游戏开发游戏npc算法
搜索引擎-搜索引擎有关排序算法研究.pdf
06-27
搜索引擎-搜索引擎有关排序算法研究.pdf
改进非支配排序遗传算法NSGA-II代码matlab实现.rar
09-23
改进非支配排序遗传算法NSGA-II代码matlab实现
一个非常快非常快的排序算法
u010742342的博客
08-19 1093
当然这个算法不是快排.这个算法是我在知乎上无意中看到有人说了一句"开一个很大的数组"而受到启发,经过思考和反复修改,写出了这个算法(是我独立完成的,但是之前肯定有人写过..不过我不知道叫什么名字罢了) 这个算法只能排序元素全部是正数的数组,虽然有局限性,但是速度非常非常非常快 排序一个长度为1亿的随机数组(该数组的元素是1亿以内的随机正数)只需要几秒,比归并排序快得多,但是还没有跟快排比较..
快速排序&堆排序
Nameseven的博客
10-02 259
快速排序 测试用例: 5 2 1 6 4 7 9 0 8 3 思路:采用的分治算法,结合递归。 1.选择一个基准值,把数组中比基准值大的数据放到基准值的右边,把比基准值小的元素放到左边。(这时,基准值被放在了正确的位置) 2.对基准值左边的数组和右边的数组不但进行步骤1。 3.递归的结束条件是小区间内没有数据或者数据只有一个。即 left>right 或者 left == right ...
写个堆排序快速排序等一些排序算法
liuyangsyouxiang的专栏
03-28 1117
堆排序 堆的存储数据结构就是一个数组,根据当前元素的index,可以计算出其父节点和子节点的index。 首先要建立一个堆,具体过程是按照完全二叉树的方式不断插入新元素,并同时向上调整堆。 然后做堆排序,具体过程是取出堆顶元素,和最后一个元素交换,同时做堆的向下调整。 如果是大顶堆,每次都取出堆顶元素和最后一个元素交换,最后就能得到一个从小到到的排序。   代码如下:   //大顶
快速 和堆 排序算法
qq_22821311的博客
09-10 291
#include #include #include #include using namespace std; void quickSort(int arr[], int i, int j) { int i1 = i; int i2 = j; if(i { int tmp = arr[i]; while(i { while(arr[j] >
算法竞赛入门经典 排列
m0_46630461的博客
05-17 228
题目描述 习题2-6 排列(permutation) 用1,2,3…9,组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。 思路 全排列,在排列的过程中判断这个数是否合理 具体代码 #include <iostream> using namespace std; int path[10]; bool st[10]; int merge(int l, int r)
九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序...
weixin_30888413的博客
06-15 102
  闲着的时候看到一篇“九大排序算法在总结”,瞬间觉得之前数据结构其实都有学过,但当初大多数都只是老师随口带过,并没有仔细研究一下。遂觉:这是欠下的账,现在该还了。   排序按照空间分类:     In-place sort不占用额外内存或占用常数的内存 插入排序、选择排序、冒泡排序、堆排序快速排序。     Out-place sort:归并排序、计数排序、基数排序、桶排序。 ...
很好很强大的堆排序
weixin_30834783的博客
03-26 62
上次提到了位图排序,这次主题也是排序,不过首先来点别的。 如何生成m个随机数?看了编程珠玑的文章,知道了一些,后来又在csdn上发现了其他人设计的,我就拿来说说吧。 如果没有头绪,那就按平常来说就是随机生成一个数,然后比较集合中是否存在,不存在放里面,否则再继续生成。按珠玑上所言,那就是 psuedo code: select =m; remaining =n; for i=[0..n]...
写一下快速排序和堆排序,两个简单又神奇的算法
世界很大我很小
09-18 1181
快速排序 void quick_sort(int array[], int begin, int end) { if(end > begin) { int pivot = begin; int last_small = begin; int i = end; while(last_small != i) { if(array[i] <= array[pivot])
算法图解-python.pdf
最新发布
08-16
总之,《算法图解-python.pdf》是一本很好的算法入门书籍,以图解和Python编程为特色,适合各类读者学习和参考。通过阅读和实践,读者可以提高算法设计和编程实现的能力,为解决实际问题提供有效的思路和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 使用栈计算后缀表达式的计算-----C++实现(详解) 9944
  • 操作系统-------用P,V操作解决生产者和消费者问题(详解!!!) 7100
  • 经典算法(八)----计数排序----图解法让你快速入门 6964
  • 操作系统-------wait和signal函数原型 6826
  • 用C++类实现单链表的基本功能(附带开辟内存空间详解) 3564

分类专栏

  • 十大排序算法 11篇
  • 力扣刷题 1篇
  • 位运算 2篇
  • C++数据结构 6篇
  • C++ 7篇
  • C++的各类容器使用方法 7篇
  • 操作系统 3篇
  • MySQL数据库学习笔记 18篇
  • 计算机网络笔记
  • dp 14篇
  • 递归 3篇
  • dfs 15篇
  • bfs 7篇
  • 贪心+优先队列 6篇
  • 高精度算法 3篇
  • 动态数组vector 1篇
  • 数组 1篇
  • STL函数库 1篇
  • 基础逻辑思维题 4篇
  • 完全背包 1篇
  • 队列与栈 1篇
  • 字符串 1篇
  • 栈和队列 3篇

最新评论

  • 职工管理系统源代码-----C++类实现----文件输入输出-----实现过程超详细讲解

    2301_82061833: 不能运行

  • 职工管理系统源代码-----C++类实现----文件输入输出-----实现过程超详细讲解

    在云朵上打呼26: 请问这个可以将结果直接输出到我建立的空白的文本文件中吗

  • 使用栈计算后缀表达式的计算-----C++实现(详解)

    qx_zlv: #include <iostream> #include <string> #include <stack> #include <cmath> using namespace std; int main() { int x = 0,times = 0; string s; getline(cin, s); stack<double> a; for (int i = 0; i < s.length(); ++i) { if (isdigit(s[i])) { while (i < s.length() && isdigit(s[i])) { x = x * 10 + s[i] - '0'; ++i; } if (s[i] == '.') { ++i; while (i < s.length() && isdigit(s[i])) { x = x * 10 + s[i] - '0'; ++i, ++times; } } a.push(x / pow(10, times)); x = 0, --i, times = 0; } if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') { double left = a.top(); a.pop(); double right = a.top(); a.pop(); switch (s[i]) { case '+': a.push(right + left); break; case '-': a.push(right - left); break; case '*': a.push(right * left); break; case '/': a.push(right / left); break; } } } cout << a.top() << endl; return 0; } 自己写的代码,把小数兼容了,代码可能有bug,不过能运行

  • 用C++类实现单链表的基本功能(附带开辟内存空间详解)

    计算机小白白,正在大一: 大佬,爱了

  • 用c++实现大数相加

    Serious_12138: 如果加数是负数呢,结果好像不行

大家在看

  • 人工智能对我们的生活影响有多大? 582
  • python简易版聊天程序 2
  • 卷积神经网络基础1 894
  • 「NumPy秘籍:释放Python数据分析的洪荒之力」(二)
  • python爬虫之bs4进行数据解析(2)

最新文章

  • 用字符串巧解大菲波数---HDU--1715
  • 图解法----十大排序算法汇总----(总有你需要的那种)
  • 经典算法(十)----桶排序----图解法让你快速入门
2020年109篇
2019年5篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司衡水seo网站优化多少钱襄樊网络推广推荐丹竹头网站推广报价铜陵企业网站设计柳州SEO按效果付费报价黄石seo优化价格合肥网站改版绍兴如何制作网站忻州阿里店铺托管推荐新乡英文网站建设飞来峡百搜标王哪家好兰州网站设计推荐大芬seo网站推广公司娄底关键词按天计费价格大连网站优化软件公司昭通网站定制推荐淄博优秀网站设计多少钱和田网站制作报价安康网站建设设计哪家好九江SEO按天扣费多少钱襄樊百度爱采购哪家好本溪网站建设设计哪家好宣城百度标王报价芜湖关键词按天收费推荐清远网络营销漳州百姓网标王多少钱信阳百度seo公司十堰网站改版报价南澳关键词按天收费多少钱光明网站推广哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化