常见排序算法

一.选择排序

1.概念:每次从无序的子数组里面选择最小的数,放在有序区的后面(既与无序区的首元素交换);不稳定排序;时间复杂度O(n^2);辅助存储O(1)

2.代码实现

int SELECTION_SORT(int *A,int len)  //len为数组元素个数
{
	for(int i=0;i<len-1;i++)
	{
		int _min=i;
		for(int j=i+1;j<len;j++)
		{
 			if(A[j]<A[_min])
			_min=j;
		}
		int temp=A[_min];
		A[_min]=A[i];
 		A[i]=temp;
	}
	return 0;
}
3. 举例

int main()
{
	int A[]={3,5,2,6,2,1,6,6,0};
	SELECTION_SORT(A,9);
	for(int i=0;i<9;i++)
		cout<<A[i]<<"  ";
	return 0;
}


结果:



二.冒泡排序

1.概念:重复访问数列n-1次,每次比较相邻的两个元素,若顺序不对则交换两个元素;稳定排序;时间复杂度O(n^2);辅助存储O(1)

2.代码实现

int BUBBLE_SORT(int *A,int len)
{
	if(A==NULL||len==0)
		return 0;
	for(int i=0;i<len-1;i++)
		for(int j=0;j<len-1-i;j++)
		{
			if(A[j]>A[j+1])
			{
				int temp=A[j];
				A[j]=A[j+1];
				A[j+1]=temp;
			}
		}
	return 0;
}
3.举例

int main()
{
	int A[]={1,3,6,3,7,2,1,8};
	<span style="font-size:12px;">BUBBLE_SORT(A,8);
	for(int i=0;i<8;i++)
		cout<<A[i]<<"   ";</span>
	return 0;
}
结果


三.直接插入排序

1.概念:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序,重复n-1次;稳定排序;时间复杂度O(n^2);辅助存储O(1)

2.实现代码

int INSERTION_SORT(int *A,int len)
{
	 for(int i=1;i<len;i++)
		for(int j=0;j<i;j++)    //j从i到0更易交换
		{
			if(A[i]<A[j])
			{
				int temp=A[i];
                                A[i]=A[j];
 				A[j]=temp;
			}
		}
		return 0;
}
3.举例

int main()
{
	int A[]={3,2,5,3,6,2,1,7,6};
	INSERTION_SORT(A,9);
	for(int i=0;i<9;i++)
		cout<<A[i]<<"   ";
	return 0;
}
结果


四.快速排序

1.概念:通过一趟递归使数组分为两个自子数组,一部分的元素都比父数组最后一个人元素小,一部分元素都比父数组的最后一个元素大,这样递归下去,直到子数组的元素个数为2;不稳定排序;平均时间复杂度O(nlogn);最坏情况时间复杂度O(n^2),当数组本来就有序时;存储辅助O(logn)

2.代码实现

int PATITION(int *A,int p,int r)
{
	int i=p-1;
	int x=A[r];
	for(int j=p;j<r;j++)
	{
		if(A[j]<x)
		{
			i=i+1;
			int temp=A[j];
			A[j]=A[i];
			A[i]=temp;
		}
	}
	i=i+1;
	A[r]=A[i];
	A[i]=x;
	return i;
}
int QUICK_SORT(int *A,int p,int r)     //p为数组第一个元素的下标,r为数组最后一个元素的下标
{
	if(p>=r)
		return 0;
	int q=PATITION(A,p,r);
	QUICK_SORT(A,p,q-1);
	QUICK_SORT(A,q+1,r);
	return 0;

}
3.举例

int main()
{
	int A[]={3,6,2,34,7,1,4,15,7,3,6};
	QUICK_SORT(A,0,10);
	for(int i=0;i<11;i++)
		cout<<A[i]<<"   ";
	return 0;
}
结果


五.归并排序

1.概念:把一个数组分成两个子数组,分别对两个子数组进行排序,然后合并两个子数组,使整个数组有序,如此递归下,直到子数组元素个数为2;稳定排序;时间复杂度O(nlogn);存储辅助O(n)

2.代码实现

int MERGE(int *A,int p,int q,int r)
{
	int len1=q-p+1;
	int len2=r-q;
	int *A1=new int[len1+1];
	int *A2=new int[len2+1];
	for(int i=0;i<len1;i++)
		A1[i]=A[p+i];
	for(int i=0;i<len2;i++)
		A2[i]=A[q+1+i];
	A1[len1]=100;              //为了后边比较方便在此设置哨兵值,一般取大于数组最大元素的值
	A2[len2]=100;
	int i=0;
	int j=0;
	for(int k=p;k<=r;k++)
	{	
		if(A1[i]<=A2[j])
		{
			A[k]=A1[i];
			i++;
		}
		else	// if(A1[i]>=A2[j])   是错的,因为若前面i++
		{
			A[k]=A2[j];
			j++;
		}
	}
	delete [] A1;
	delete [] A2;
	return 0;
}

int MERGE_SORT(int *A,int p,int r)
{
	if(p<r)
	{
		int q=(p+r)/2;
		MERGE_SORT(A,p,q);
		MERGE_SORT(A,q+1,r);
		MERGE(A,p,q,r);
	}
	return 0;
}
3.举例

int main()
{
	int A[]={5,3,6,10,7,4,2,0,7,3};
	MERGE_SORT(A,0,9);
	for(int i=0;i<10;i++)
		cout<<A[i]<<"   ";
	return 0;
}
结果


六.堆排序

1.概念利用最大堆设计的一种排序算法,利用数组的特点快速定位指定索引的元素;

不稳定排序;时间复杂度O(nlogn);存储辅助O(1)

2.代码实现

int MAX_HEAPIFY(int *A,int i,int len)    //维护最大堆      len待排数组元素个数
{
	int left=2*i+1;
	int right=2*i+2;
	int large;
	if(left<len&&A[left]>A[i])
		large=left;
	else
		large =i;
	if(right<len&&A[right]>A[large])
		large=right;
	if(large!=i)
	{
		int temp=A[large];
		A[large]=A[i];
		A[i]=temp;
		MAX_HEAPIFY(A,large,len);
	}
	return 0;
}

int BULID_MAX_HEAPIFY(int *A,int len)          //建最大堆
{
	for(int i=len/2-1;i>=0;i--)
		MAX_HEAPIFY(A,i,len);
	return 0;
}

int HEAP_SORT(int *A,int len)           //堆排序
{
	BULID_MAX_HEAPIFY(A,len);
	for(int i=len-1;i>0;i--)
	{
		int temp=A[i];
		A[i]=A[0];
		A[0]=temp;
		len=len-1;
		MAX_HEAPIFY(A,0,len);
	}
	return 0;
}
3.举例

int main()
{
	int A[]={5,3,9,7,6,2,6,8,3};
	HEAP_SORT(A,9);
	for(int i=0;i<9;i++)
		cout<<A[i]<<"   ";
	return 0;
}
结果:


七.shell(希尔)排序

1.概念:先将整个待排序列分割为若干个子序列分别进行直接插入排序,直到整个序列"基本有序"时,在对全体进行一次直接插入排序。不稳定排序,时间复杂度O(n^s) 1<s<2,s取决于每轮选择的增量;存储辅助O(1)

2.实现代码

int SHELL_SORT(int *A,int len)
{	
	for(int k=len/2;k>0;k=k/2)            //k为增量
		for(int i=k;i<len;i++)
		{
			int j=i;
            if(A[i]<A[i-k])
			{
				int temp=A[i];
				do{
					A[j]=A[j-k];
					j=j-k;
				}while(j>=0&&A[j]>temp);
				A[j+k]=temp;

			}
		}	
	return 0;
}
3.举例

int main()
{
	int A[]={5,2,6,4,8,5,9,1,2};
	SHELL_SORT(A,9);
	for(int i=0;i<9;i++)
		cout<<A[i]<<"   ";
}
结果:



八.计数排序

1.概念:将数组A的每个元素作为另一个辅助数组B的下标,统计出A每个元素出现的次数,从而确定出A的每个元素在排序后的数组中所处的位置;稳定排序;时间复杂度O(n+k);存储辅助O(n+k)

2.实现代码

int COUNTING_SORT(int *A,int len,int k)         //  k大于数组中最大数
{
	int *B=new int[k];
	int *C=new int[len];
	for(int i=0;i<k;i++)
		B[i]=0;
	for(int i=0;i<len;i++)
		B[A[i]]++;                             //统计每个元素出现的次数                    
	
	for(int i=1;i<k;i++)
		B[i]=B[i]+B[i-1];                      //计算排序后每个元素前面有多少元素,对于A中重复的元素,表示重复元素的最后一个前面有多少元素

	for(int i=len-1;i>=0;i--)         //i从后向前保证了稳定排序
	{
		C[B[A[i]]-1]=A[i];            //由于下标是从0开始,注意-1,不然就错
		B[A[i]]--;                    //考虑A中重复的元素
	}
	for(int i=0;i<len;i++)
	{
		A[i]=C[i];
	}
	delete [] B;
	delete [] C;
	return 0;
}
3.举例

int main()
{
	int A[]={3,2,6,2,5,7,1,9};
	COUNTING_SORT(A,8,12);
	for(int i=0;i<8;i++)
		cout<<A[i]<<"   ";
	return 0;
}
结果:


标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值