概念:
快速排序是交换排序的一种(交换排序包括快速排序和冒泡排序)。
基本思想是:选任意一个数作为key值,通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比key小的数,右边都是比key大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
对于快速排序我们通常使用左右指针法完成。
左右指针法:
① . 定义指针begin指向数组首端、end指向末端,key为任一个值。
② . 先让begin从前向后走找 >key的值,找到则停止。再让end由后向前找 < key的值,找到则停止。
③ . 此时将begin的数值与end的数值进行交换。
④ . 若指针begin和end相遇,则交换其与key的值。
此时,key左边为小于他的数,右边为大于他的数。
⑤ . 将key左侧区间数列和右侧区间数列按上述步骤继续执行,直到有序。
代码:
//左右指针法
int Partsort(int *a, int left, int right)
{
int key = a[right];
int begin = left;
int end = right;
while (begin < end)
{
while (begin < end && a[begin] <= key)
{
begin++;
}
while (begin < end && a[end] >= key)
{
end--;
}
if (begin < end)
swap(a[begin], a[end]);
}
swap(a[begin],a[right] );
return begin;
}
void QuickSort(int* a, int left, int right)
{
if (left >= right)
return ;
if (left < right)
{
int div = Partsort(a, left, right);
QuickSort(a, left, div - 1);
QuickSort(a, div + 1, right);
}
}
test
int main()
{
int arr[] = { 2, 4, 1, 3, 7, 6, 8, 5 };
int length = sizeof(arr) / sizeof (arr[0]);
QuickSort(arr,0,length-1);
for (int i=0; i < length; ++i)
{
cout << arr[i] <<" ";
}
cout << endl;
}