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