快速排序的基本思想:快速排序又称为分区交换排序,是目前以知的平均速度最快的一种排序方法,采用一种分治的策略,是对冒泡排序的一种改进。其基本思想是:在待排序文件的记录中任取其中一个记录,通常选取第一个记录。以该记录的关键字为分界点(pivot),经过一趟排序后,将全部记录分为两部分:所有比分界点小的记录都存放在分界点之前,所有比分界点大的记录都排在分界点之后,然后再分别对这两个部分重复上述过程,直到每一部分只剩下一个记录为止。显然,每趟快速排序后,分界点都找到了自己在有序序列中的适当位置。
一次快速排序(一次划分)的实现过程如下:
设置两个指针,low和high,分别指向待排序列两端,并将序列中的第一个记录暂存起来作为分界点(pivot)。首先,用high指针所指记录的关键字与pivot进行比较,若该关键字比pivot大(或相等),则high指针集训向前搜索;若该关键字比pivot小,则将high指向的记录存入low指针所指的位置,此时high指针停止搜索,转由low指针开始向后搜索。
low向后移动,将low指针所指记录的关键字与pivot进行比较,若该关键字比pivot小,则low指针继续向后搜索;若该关键字比pivot大(或相等),则将low指向的记录存入high指针所指向的位置上,此时low指针停止搜索,high指针重新开始被暂停的向前搜索,......。整个划分过程就是在high指针和low指针不断交替地进行序列的向前和向后搜索中进行的,知道low指针和high指针相遇为止,这时他们相遇的位置就是pivot对应记录在有序序列终的位置,将pivot写入该位置,从而完成一次划分。
快速排序算法递归实现代码:
#include <iostream>
using namespace std;
int Partition(int *a,int low,int high) //进行划分
{
int pivot;
pivot = a[low];
while(low < high)
{
while(low < high && a[high] >= pivot)
high--;
if(low < high)
{
a[low]=a[high];
low++;
}
while(low < high && a[low] <= pivot)
low++;
if(low < high)
{
a[high]=a[low];
high--;
}
}
a[low]=pivot;
return low;
}
void QuickSort(int *a ,int low,int high)
{
int id;
if(low < high)
{
id = Partition(a,low,high);
QuickSort(a,low,id-1);
QuickSort(a,id+1,high);
}
}
int main()
{
int a[10] = {3,2,1,5,6,7,2,10,8,9};
int low = 0;
int high = 9;
cout << "排序之前:";
for(int i=0;i<10;i++)
cout << a[i] << " ";
cout << endl;
QuickSort(a,low,high);
cout << "排序之后:";
for(int i=0;i<10;i++)
cout << a[i] << " ";
cout << endl;
return 0;
}
排序结果: