首页 > 其他分享 >数据结构-八大排序

数据结构-八大排序

时间:2024-12-06 15:32:40浏览次数:12  
标签:排序 八大 dk int void id 数据结构 复杂度

插入排序

时间复杂度为\(O(n^2)\)


//插入排序 (下标从1开始存放元素) (王道数据结构)
void InsertSort(int a[], int n) {
	int i, j;
	for ( i = 2; i <= n; i++) {
		if (a[i] < a[i - 1]) {

			a[0] = a[i]; //数组首位位缓存区,也就是哨兵

			for ( j = i - 1; a[0] < a[j]; j--) //从后往前找其插入位置
				a[j + 1] = a[j]; //若当前比较到这个数比哨兵来的大,这个数往后挪

			a[j + 1] = a[0]; //复制到插入的位置
		}
	}

	/*也可以写成这样子*/

	for (int i = 1; i < n; i++) {
		int end = i;
		int temp = a[end + 1];
		while (end >= 1) {
			if (temp < a[end]) {
				a[end + 1] = a[end];
				end--;
			} else break;
		}
		a[end + 1] = temp;

	}
}

希尔排序

时间复杂度为最差\(O(n^2)\),平均约为\(O(n^{1.3})\)

本质上就是在插入排序的基础上加入对应的增量

void ShellSort(int a[], int n) {
	//a[0]位暂存位置
	int dk, i, j; //dk为增量

	for (dk = n / 2; dk >= 1; dk /= 2) { //增量变化,根据题意去修改

		for ( i = dk + 1; i <= n; i++)
			if (a[i] < a[i - dk]) {
				a[0] = a[i]; //暂存元素

				for (j = i - dk; j >= 1 && a[0] < a[j]; j -= dk)
					a[j + dk] = a[j]; //若当前元素大于a[0]挪对应增量的位置

			}
		a[j + dk] = a[0];//插入对应位置

	}





}



/*也可以写成这样子*/

void ShellInsert(int a[], int dk) { //这个是传入增量
	//
	int n = lena; //假设已知a的长度
	for (int i = 1; i <= n - dk; i++) {
		int id = i;
		int tmp = a[id + dk];
		while (id >= 1) {
			if (tmp < a[id]) {
				a[id + dk] = a[id];
				id -= dk;
			} else break;
		}
		a[id + dk] = tmp;
	}


}

冒泡排序

时间复杂度为\(O(n^2)\)

void BubbleSort(int a[], int n) {

	for (int i = 0; i < n - 1; i++) {
		for (int j = n - 1; j > i; j--) {
			if (a[j - 1] > a[j]) swap(a[j - 1], a[j]);
			//要得到从小到大排序,从后往前扫,如果前面的元素大于后面的元素就交换
		}

	}

}

选择排序

时间复杂度为\(O(n^2)\)

void SelectSort(int a[],int n)
{
	for(int i=0;i<n-1;i++)//一共进行n-1趟
	{
		int mi=i;//记录最小元素位置
		for(int j=i+1; j<n; j++) 
			if(a[j]<a[mi]) mi=j;//更换最小值位置
		if(mi!=i) swap(a[i],a[mi]);//交换元素
	}
}

快速排序

时间复杂度为最好为\(o(log_2n)\),最坏\(O(n^2)\)

int Part(int a[],int l,int r)
{
	int piv=a[l]; //将当前表中的第一个元素设为枢轴,对表进行划分
	while(l<r){
		while(l<r && a[r]>=piv) r--; //找到比枢轴小的元素
		a[l]=a[r];//把小的元素移动到左端
		while(l<r&& a[r]<=piv) l++;
		a[r]=a[l];//把大的元素移动到右端
	}
	a[l]=piv;
	return l;
}

void QuickSort(int a[],int l,int r)
{
	if(l<r){
		int pivpos=Part(a,l,r);//划分
		QuickSort(a,l,pivpos);//对子表进行递归的排序
		QuickSort(a,pivpos+1,r);
	}
	
}

归并排序

时间复杂度为最好为\(o(nlog_2n)\)

//int tmp[]
void MergeSort(int a[],int l,int r)
{
	if(l>=r) return ;
	int mid= (l+r) >>1;
	MergeSort(a,l,mid);//左侧子序列递归排序
	MergeSort(a,mid+1,r);//右侧子序列递归排序
	
	int k=0,i=l,j=mid+1;
	while(i<=mid &&j<=r)
	{
		if(a[i]<=a[j] )  tmp[k++]=a[i++];
		else tmp[k++] =a[j++];
	}
	//未检测完的继续复制进去
	while(i<=mid) tmp[k++]=a[i++];
	while(j<=r) tmp[k++]=a[j++];
	
	for(i=l,j=0;i<=r;i++,j++) a[i]=tmp[j];
}

标签:排序,八大,dk,int,void,id,数据结构,复杂度
From: https://www.cnblogs.com/swjswjswj/p/18590648

相关文章

  • 数据结构——图(遍历,最小生成树,最短路径)
    目录一.图的基本概念二.图的存储结构1.邻接矩阵2.邻接表三.图的遍历1.图的广度优先遍历2.图的深度优先遍历四.最小生成树1.Kruskal算法2.Prim算法五.最短路径1.单源最短路径--Dijkstra算法2.单源最短路径--Bellman-Ford算法3.多源最短路径--Floyd-Warshall算法......
  • P2824 [HEOI2016/TJOI2016] 排序
    P1136迎接仪式动态规划好题状态设计:我们认为z是1,j是0,产生贡献的是01对我们用状态\(f[i][j][k][0/1]\)表示考虑到第\(i\)位,进行了\(j\)次将1变成0的操作和\(k\)次将0变成1的操作,操作过后第\(i\)位为\(0/1\)时的答案状态转移:然后我们就有方程:\(a_i=1:\)\(f......
  • P3165 [CQOI2014] 排序机械臂
    P3165[CQOI2014]排序机械臂题目描述为了把工厂中高低不等的物品按从低到高排好序,工程师发明了一种排序机械臂。它遵循一个简单的排序规则,第一次操作找到高度最低的物品的位置\(P_1\),并把左起第一个物品至\(P_1\)间的物品(即区间\([1,P_1]\)间的物品)反序;第二次找到......
  • 二叉排序树的定义以及相关操作
    二叉排序树:又称二叉查找树(BST,BinarySearchTree)二叉排序树的性质:左子树节点值<根节点值<右子树节点值所以 对一棵二叉排序树进行中序遍历,会得到一个递增的序列定义二叉排序树的结点//二叉排序树的结点typedefstructBSTNode{intkey;structBSTNode*lc......
  • C++14关联容器set自定义排序函数报错
    十年前的一个C++项目编译报错:“boolcompatetor_asc::operator()(conststd::wstring&,conststd::wstring&)”:不能将“this”指针从“constcompatetor_asc”转换为“compatetor_asc&”。对应的代码如下:classcompatetor_asc{public:booloperator()(conststd::......
  • 【唐叔学算法】第一天:Java常见数据结构
    工欲善其事必先利其器。虽然算法本身是不区分语言的,但是作为专注于Java开发的唐叔,那么善于使用Java自带的已实现的数据结构,将有利于在更短的时间内快速通关具体的算法题。而今天我们就来学习Java中的数据结构实现。善用这些API将有助于我们更有效地存储和处理数据。数组(Ar......
  • vue基础之11:列表排序
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • 数据结构——编程实现中缀表达式转成后缀表达式
    中缀表达式:运算符在操作数中间例如3+4,3*4后缀表达式:运算符在操作数的后面例如34+,34*计算机在运算时,要把中缀表达式转成前缀表达式(波兰式)或后缀表达式(逆波兰式),因为计算机遍历中缀表达式时的时间复杂度太大举例:3+4*2-2/(1+1)+5=3+8-1+5=15转成后缀表达式为:342*+211......
  • 数据结构实验一
    数据结构实验一2024.12.5采用递增有序的顺序表表示集合,求解两个集合的交集、并集和差集(1)定义顺序表的存储结构;(2)实现存储递增有序集合的顺序表的建立、求交集、并集和差集等运算;(3)要求算法的时间性能在线性时间复杂度内;(4)和采用无序顺序表所表示的集合的有关运算的时间性能......
  • mysql索引概念以及索引底层数据结构
    一、什么是MySQL索引索引是数据库管理系统中一种用于提高数据检索效率的数据结构。通过在表的一个或多个列上创建索引,可以显著加快数据查询的速度,但会增加插入、删除和更新操作的开销。MySQL中索引的核心作用是快速定位数据位置,减少磁盘I/O操作,从而提高查询效率。索......