快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:基于分治的思想,是冒泡排序的改进型。首先在数组中选择一个基准点(该基准点的选取可能影响快速排序的效率,后面讲解选取的方法),然后分别从数组的两端扫描数组,设两个指示标志(left指向起始位置,right指向末尾),首先从后半部分开始,如果发现有元素比该基准点的值小,就交换left和right位置的值,然后从前半部分开始扫秒,发现有元素大于基准点的值,就交换low和high位置的值,如此往复循环,直到left>=right,然后把基准点的值放到left这个位置。一次排序就完成了。以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。
代码实现
#include <iostream>
using namespace std;
void quicksort(int[], int, int);
int main()
{
int num[] = {11,12,7,22,3,16,14,19,30,23};
cout << "排序前:" << '\t';
for (int i = 0; i < 10; i++)
{
cout << num[i] << '\t';
}
cout << endl;
quicksort(num, 0, 9);
cout << "排序后:" << '\t';
for (int i = 0; i < 10; i++)
{
cout << num[i] << '\t';
}
}
void quicksort(int a[], int left, int right)
{
if (left > right) return;//迭代安全带
int i = left;
int j = right;
int temp = a[left];
while (i != j)
{
while (a[j] >= temp && i < j) j--;
while (a[i] <= temp && i < j) i++;
if (i < j)
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
//基准数归位
a[left] = a[i];
a[i] = temp;
//分别对基准数两边的数组进行再次快速排序
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}