快速排序(配图详解)

算法档案
 



时间复杂度:O(n2)
最优时间复杂度:O(n * logn)
平均时间复杂度:O(n * logn)
空间复杂度:根据实现的方式不同而不同
稳定性:不稳定

算法步骤
 


 

  • 第一步:在序列中选择一个元素作为“基准点” ,比如栗子中的7就是基准点
  • 第二布:将所有小于“基准点”的元素都移到左边,所有大于“基准点”的元素都移到右边
  • 第三步:对“基准点”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止、
  • 呃,,,文字不懂没关系,上图!快速排序(配图详解)

快速排序(配图详解)

。。。。。。。。

按照第一趟如图所示的方法递归左右两边的子序列

代码如下:

#include<stdio.h>
/*快速排序*/ 
void quick_sort(int array[],int left,int right);

void quick_sort(int array[],int left,int right)
{
	int i = left ,j = right;
	int temp;
	int pivot;
	
	pivot = array[(left + right) /2];
	
	while (i <= j)
	{
		//从左到右找大于等于基准点的元素 
		while (array[i] < pivot)
		{
			i++;
		}
		//从右到左找小于等于基准点的元素
		while (array[j] > pivot)
		{
			j--;
		} 
		//如果i<=j,则互换元素 
		if (i <= j)
		{
			temp = array[i];
			array[i] = array[j];
			array[j] = temp;
			i++;
			j--;
		} //第一趟走的内容, i > j时第一趟结束了
	}
	/*开始递归*/
	if (left < j)//从左往右 
	{
		quick_sort(array,left,j);//如果j小于0时,就可以归了 left = 0
	} 
	if (i < right)
	{
		quick_sort(array,i,right);//如果i大于9时, 与也可以归了 right = 9
	}
}
int main()
{
	int array[] = {73,34,45,2,3,5,7,8,9,29,89,100,13,15};
	int i,length;
	
	length = sizeof(array)/sizeof(array[0]);
	//printf("%d",length); 14
	quick_sort(array, 0, length-1);
	
	printf("排序后的结果是:\n");
	for(i = 0 ; i < length; i++)
	{
		printf("%d  ", array[i]);
	}
	putchar('\n');
									
									
									
}
									

运行结果:

快速排序(配图详解)

明白了吗 是再总结下还快速排序(配图详解)

总结思路

通过一趟排序将待排序数据分割成独立的两部分,

其中一部分的所有元素均比另一部分的元素小,

然后分别对这两部分继续进行排序,

重复上述步骤直到排序完成。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-09-09
猜你喜欢
  • 2021-11-17
  • 2021-08-13
  • 2022-01-05
  • 2022-12-23
  • 2022-12-23
  • 2022-01-13
相关资源
相似解决方案