算法分析--递归与分治--快速排序

快速排序算法策略

  1. 分解:选择数组a中的一个元素q作为基准,把数组划分为三段a1q。
  2. 递归:对数组a1,a2递归调用快速排序算法。
  3. 合并:不需要额外操作

快速排序法时间复杂度分析

1、最优情况

每次都刚好在中间。

T(n)=O(1) (n\leq 1)

T(n)=T(n/2)+O(n)(n>1)

解递归方程得:

T(n)=O(n\log n)

2、最坏情况

T(n)=O(1) (n\leq 1)

T(n)=T(n-1)+O(n)(n>1)

解递归方程得:

T(n)=O(n^{^{2}})

3、平均情况

算法图解

第一步:

1、选择第一个元素41作为标准。

2、指针i从左边开始寻找比41大的元素,找到67。

3、指针j从右边寻找比41小的元素,找到24。

4、交换24和67,继续寻找,直到i>j,跳出循环。

5、交换41和j当前指向的元素0.

算法分析--递归与分治--快速排序_第1张图片

第二步:

1、41的位置已经正确。

2、对数组0、24、34和69、67、78、58、62、64按照第一步的方法排序。

算法分析--递归与分治--快速排序_第2张图片

第三步:

1、0、41、69、78的位置正确。

2、对24、34和67、64、58进行排序

算法分析--递归与分治--快速排序_第3张图片

第四步:

1、0、24、34、41、58、62、69、78位置正确。

2、对64、67排序。

算法分析--递归与分治--快速排序_第4张图片

 

 

算法C++实现

void quicksort(int a[], int q, int r);
int partition(int a[], int q, int r);

void quicksort(int a[], int q, int r)
{
	if (q < r)
	{
		int p = partition(a, q, r);//left part < target | target | right par > target
		quicksort(a, q, p - 1);//sort left part
		quicksort(a, p + 1, r);//sort right part
	}
}
int partition(int a[], int q, int r)
{
	int i = q;
	int j = r;
	int target = a[q];
	while (true)
	{
		i++;
		while (a[i] < target && i < r)//Find a[i] >= target
		{
			i++;
		}
		while (a[j] > target)//Find a[j] <= target
		{
			j--;
		}
		if (i >= j) break;
		int temp = a[j];//Swap a[i], a[j]
		a[j] = a[i];
		a[i] = temp;
	}
	int temp = a[j];//Swap a[j], target
	a[j] = a[q];
	a[q] = temp;
	return j;
}


void main()
{
	#define length 10 //Length of the original array
	int a[length] = {};
	int b[length] = {};
	for (int i = 0; i < length; i++)//Generate the original array
	{
		a[i] = rand() % 100;
	}
	for (int i = 0; i < length; i++)//print the original array
	{
		cout << a[i] << " ";
	}
	cout << endl;
	quicksort(a,0, length-1);//sort the array
	for (int i = 0; i < length; i++)//print the sorted array
	{
		cout << a[i] << " ";
	}

	system("pause");	
}

 

运行结果如下

 

 

 

 


 

你可能感兴趣的:(读书笔记,数据结构与算法分析)