分治法——快速排序(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 的值。就是划分的区间位置。
按照这种方法不断地划分序列,到最后序列只有一个元素的时候,合并序列,合并后的序列就是有序的。