首页 > 其他分享 >数据结构:快排

数据结构:快排

时间:2024-10-11 18:52:56浏览次数:11  
标签:arr right int 快排 while key 数据结构 left

注:所有的快排针对无重复大量数据是很快的,但是针对有重复大量数据的排序是很慢的;

1.霍尔(hoare)版本

时间复杂度:O(N*logN)

稳定性:不稳定;在fun()函数while判断时一不小心就会存在越界和和死循环问题;

霍尔版本的快排,代码如下:主要实现再func()和quick()函数中

int func(int arr[],int left,int right) {
	int key = left;	//取最左边的值;或最右边的值是一样的;
	while (left < right) {	//相遇就结束了
		//右边找小
		while (left < right && arr[right] >= arr[key])	right--;//越界和死循环问题
		//左边找大
		while (left < right && arr[left] <= arr[key])	left++;
		swap(arr[left], arr[right]);
	}
	//相遇之后,left==right;再交换
	swap(arr[left], arr[key]);//如何保证相遇之时的值比keyi小,因为是right先走的,用它来保证
							//right先走,停下来的位置一定比key小或者相遇,L停下来是相遇或比key大,
							//因为取值是在最左边取的值,已知arr[left]==arr[key];
							//如果left先走,走到相遇,需要再比较一下
							//如果right先走,相遇之时就代表已经没有比key大的了
	return right;
}
void quicksort(int arr[],int begin,int end) {
	if (begin>=end) return; //结束条件判断;
	int key=func(arr, begin, end);
	//[begin,key-1]key[key+1,end]
	quicksort(arr,begin, key - 1);
	quicksort(arr, key + 1, end);
}
int main()
{	
	int a[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int right = sizeof(a) / sizeof(int)-1;
	int left = 0;
	quicksort(a, left, right);	
	for (auto x : a) cout << x << endl;
	return 0;	
}	

2.挖坑法版本

叙述:将key位置(要比较的那个数)的数值保存起来,还是从右边找小,将小的放到坑里,再从左边找大,再放到小的那个坑里,相遇之时再把剩的key值放坑里;左边为坑右边找,右边为坑左边找,相遇之时就是坑,再把key的值放进去

时间复杂度:O(N*logN)

稳定性:不稳定;在fun()函数while判断时一不小心就会存在越界和和死循环问题;

只写实现方法,其余按照霍尔版本的代码写,程序可以照常运行

int func(int arr[],int left,int right) {
	int key = arr[left];	//将要比较的值保存起来;
	int hole = left;	//将坑挖出来
	while (left < right)
	{	//右边找小
		while (left < right && arr[right] >= key) right--;
		arr[hole] = arr[right];
		hole = right;
		//左边找大
		while (left < right && arr[left] <= key)left++;
		arr[hole] = arr[left];
		hole = left;
	}
	arr[hole] = key;
	return hole;
}

3.双指针版本

时间复杂度:O(N*logN)

稳定性:不稳定;

int func(int arr[],int left,int right) {
	int key = left;
	int prev = left;
	int cur = left+1;
	while (cur <= right){
		if (arr[cur] < arr[key] && ++prev != cur)swap(arr[prev], arr[cur]);
		cur++;
	}
	swap(arr[prev], arr[key]);
	key = prev;
	return key;
}

 这三种类型的快排,都是以最左边的arr[0]作为判断依据,不停的排序;在实际应用中,可以采取三点取中法来作为比较依据;代码是要改变的;

越无序,重复性越小的数据,使用此三种快排都可以;在实际应用中,就是双指针法最为稳妥;代码量最少

可是对于重复性特别大的数据,一般采用三指针法快排,来操作

力扣:283题,有异曲同工之妙,但是题型和写法完全不同,希望诸君仔细体会;

注:并不是故意的将所有的快排都列为不稳定;而是边界及判断问题,确实是学习的一大难点

标签:arr,right,int,快排,while,key,数据结构,left
From: https://blog.csdn.net/qincjun/article/details/142853999

相关文章

  • 【数据结构】深度解析堆排序
    目录......
  • 数据结构实验第六周
    6-1在一个数组中实现两个堆栈原理就是共享栈,不会的可以看我的数据结构博客StackCreateStack(intMaxSize){StackS=(Stack)malloc(sizeof(structSNode));//这个初始化记得写S->Top1=-1,S->Top2=MaxSize;//栈满的条件S->MaxSize=MaxSize;S->Data=(int......
  • 20241011 大二上 数据结构与算法 堆
    1.堆排序堆排序是一种原地排序算法,即不需要额外的空间来存储数据,只需要在原数组上进行操作即可。堆排序是一种不稳定排序算法,即可能会改变相同元素的相对顺序。例如,如果数组中有两个相同的元素,它们可能会在排序过程中被交换,导致它们的顺序发生变化。堆排序的时间复杂度为O(nlog......
  • 【C#】复杂数据结构和Json的相互转换
    数据结构定义//数据结构定义publicclassPeople{publicstringname;publicBaseInfobaseInfo;publicList<School>education;}publicclassBaseInfo{publicintage;publicboolgender;publicList<Connection>connection;}注意一......
  • 浙江大学数据结构04-树7 二叉搜索树的操作集
    题目本题要求实现给定二叉搜索树的5种常用操作。函数接口定义:BinTreeInsert(BinTreeBST,ElementTypeX);BinTreeDelete(BinTreeBST,ElementTypeX);PositionFind(BinTreeBST,ElementTypeX);PositionFindMin(BinTreeBST);PositionFindMax(BinTr......
  • 数据结构笔记2
    数据结构第三章栈第四章队列第五章数组和特殊矩阵第六章串第七章树与二叉树第八章图第九章查找第十章排序第三章栈栈:只允许一端插入或者删除的线性表。栈分为顺序栈和链栈。顺序栈的实现:#defineMaxSize50typedefstruct{ ElemTypedata[MaxSize]; /......
  • 数据结构题解报告
    [GDOI2016]疯狂动物城对于大多树上区间问题往往加个树剖就能变成普通区间问题,只是说复杂度会加个\(log\),出题人这么做的理由可能是想锻炼一下评测姬吧选手的码力吧。而强制在线只需要可持久化数据结构即可。本题同理可视作区间问题用线段树维护,考虑推式子降次以便于维护\(ans......
  • 【趣学C语言和数据结构100例】
    【趣学C语言和数据结构100例】问题描述输入两个正整数m和n,求其最大公约数和最小公倍数输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数求Sn=a+aa+aaa+…+a…a之值,其中a是一个数字,n表示a的位数,n、a由键盘输入。例如:2+22......
  • 高清图解28个高并发之数据结构/数据结构场景匹配技巧分析(高并发精通篇一)
    Java集合以ArrayList、LinkedList、HashSet、TreeSet和HashMap等组件为核心,构筑了强大而灵活的数据结构体系。这些组件精心设计以满足不同的性能和功能需求,如ArrayList的动态数组支持快速随机访问,而LinkedList的双向链表结构则擅长于频繁的插入和删除操作。HashSet基于......
  • 前端数据结构之数组
    对象允许存储键值集合,这很好。但很多时候我们发现还需要有序集合,里面的元素都是按顺序排列的。例如,我们可能需要存储一些列表,比如用户、商品以及HTML元素等。这里使用对象就不是很方便了,因为对象不能提供能够管理元素顺序的方法。我们不能在已有的元素“之间”插入一个......