分治法——快速排序(quicksort)

先上代码

#include <iostream>
using namespace std;

int partition(int a[],int low, int high)
{
	int pivot = a[low], i = low, j = high;
	while(i < j)
	{
		while(i < j && pivot <= a[j])
			j--;
		if(i < j)  swap(a[i++],a[j]);
		while(i < j && pivot >= a[i])
			i++;
		if(i < j) swap(a[j--],a[i]);
	}
	return j;
}


void quicksort(int a[],int low, int high)
{
	int pivotpos;
	if(low < high)
	{
		pivotpos = partition(a,low,high);
		quicksort(a,low,pivotpos);
		quicksort(a,pivotpos+1,high);
	}
}


int main()
{
	int arr[10] = {1,22,3,4,5,6,77,18,99,10};
	quicksort(arr,0,9);
	for(int i = 0; i < 10; i++)
		cout<<arr[i]<<" ";
	cout<<"\n"; 
	return 0;
 } 

 在上篇博客,归并排序里面提到的分治法三步骤。分、治、合并。

快速排序里面主要步骤是第一步,划分。

首先取序列里面的第一个元素作为基准 pivot,然后将序列划分为两部分,一部分大于 pivot,一部分小于 pivot。( pivot = a[low] )

划分的具体办法:定义两根指针 i 和 j,i 从序列的最左边开始往右,j 从序列的最右边往左。当 i < j 的时候进行一下操作:

1基准pivot的位置和 i 的位置是相同的。这种情况下,就应该对 j 进行操作。 当  arr[j] >= pivot 的时候,直接 j - -。直到不符合这个条件的时候就交换基准和 a[j] 的的值,这个时候基准也就是 a[j]。

2基准的位置和 j 的位置是相同的。这种情况下,就应该对 i 进行操作。 当  arr[i] <= pivot 的时候,直接 i ++。直到不符合这个条件的时候就交换基准和 a[i] 的的值,这个时候基准的位置又是 i 的位置。

就可以重复1步骤。然后继续运行循环执行 1、2 操作。

当 i 和 j 相等的时候,返回 i 或者 j 的值。就是划分的区间位置。

按照这种方法不断地划分序列,到最后序列只有一个元素的时候,合并序列,合并后的序列就是有序的。

posted @ 2019-03-06 09:28  stul  阅读(450)  评论(0编辑  收藏  举报