练车加端盘子也挡不住我学习系列——快速排序算法

铁汁们,今天拿捏了啊,练车时一会就看懂了快速排序算法。
在这里插入图片描述

什么是快速排序?

快速排序(Quick Sort)是对冒泡排序的一种改进,它是排序算法基本思想是选取一个记录作为枢轴,经过一趟排序,将整段序列分为两个部分,其中一部分的值都小于枢轴,另一部分都大于枢轴。然后继续对这两部分继续进行排序,从而使整个序列达到有序。 它是不稳定的。由C. A. R. Hoare在1962年提出的一种划分交换排序,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数,它的最好情况为O(nlogn),最坏情况为O(n^2),平均时间复杂度为O(nlogn)。
在这里插入图片描述

基本思想

对于一个数组A,调整它的元素位置,使得A[1]的左边所有的元素都不超过A[1],其右边的元素都大于A[1]。我们采取two pointers思想来实现此算法。

  1. 先将A[1]临时储存到变量temp中,然后另两个下标分别指向序列的头部和尾部(left=1,right=n)。
  2. 只要right指向的元素大于temp,right指针就不断左移,当某个数小于temp时,此时将A[right]元素移至left指向的元素A[left]处。
  3. 只要left指向的元素小于temp,left指针就不断右移,当某个数大于temp时,此时将A[left]元素移至right指向的元素A[right]处。
  4. 重复2、3,直到left与right相遇,把temp放到相遇的地方。

代码实现

int Partition(int A[],int left,int right)
    {
    	int temp=A[1];
    	while(left<right)
    	{
    		while(temp[right]>temp)
    		{
    			right--;//指针左移
    		}
    			A[left]=A[right];
    		while(temp[left]<temp)
    		{
    			left++;//指针右移
    		}
    		A[right]=A[left];
    	}
    	A[left]=temp;
    	return left;//返回最终位置
    }

在这里插入图片描述
实现了这个算法,那我们就可以真正的实现快速排序的算法了!

  1. 调整序列中的元素,使当前最左端的元素在调整后满足左侧所有元素均不超过该元素,右侧元素均大于该元素。
  2. 对该元素的左侧和右侧分别进行递归进行1的调整,直到调整区间的长度不超过一为止。
 void quickSort(int A[],int left,int right)
    {
    	if(left<right)
    	{
    		int pos=Partition(A,left,right);
    	    quickSort(A,left,pos-1);//递归实现对左子区间进行快速排序
    	    quickSort(A,pos+1,right);//递归实现对右区间进行快速排序
    	}
    }

再见喽,博主明天接着更新!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pipihan21/article/details/107444153