挑战二--第七章高等排序(三)

版权声明:随便写写,也不重要,欢迎挑错讨论 https://blog.csdn.net/qq_37305947/article/details/79858979

快速排序

很好理解?类似于归并排序,归并排序每次将数组分成两个有序数组最后再将一步一步把小的数组“整合”起来

快速排序的本质就是将一整个数组不断缩小范围排序,只不过因为在分割的时候就已经排序前面的一定比分界值小,后面的一定比分界值大,然后一步一步分下去直至最后就已经排好,不需要像归并排序一样手动合并。

平均时间复杂度为O(nlogn)。

需要注意的是快速排序的规定值的选取,最坏的情况将把复杂度高达O(n²).......这我就不仔细找了。。因为并没有遇到这样的题。。还是先乖乖的就拿最后一个值当分界值好了。。。。


实现代码

int partition(Card a[],int n,int p,int r){
	int i,j;
	Card t,x;
	x=a[r];
	i=p-1;
	for(j=p;j<r;j++){
		if(a[j].v<=x.v){
			i++;
			t=a[i],a[i]=a[j],a[j]=t;
		}
	}
	t=a[i+1];a[i+1]=a[r];a[r]=t;
	return i+1;
}

void q_sort(Card a[],int n,int p,int r){
	int q;
	if(p<r){
		q=partition(a,n,p,r);
		q_sort(a,n,p,q-1);
		q_sort(a,n,q+1,r);
	}
}

其实就是在分割下面多了一个调用的函数,先将大数组分割成两个小数组再分别将两个小数组进行分割处理。知道不可再分割已经将整个数组排好。


猜你喜欢

转载自blog.csdn.net/qq_37305947/article/details/79858979