快速排序(Quick Sort):快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟排序,将排序记录分割中两个部分,其中一部分记录的关键字比另一部分关键字都要小,再分别对两部分记录进行排序,已达到整个序列有序的目的。快排中用到了递归的思想,在分割出两部分以后对每一部分在进行快排,直到分割到每一部分只有一个记录为止。
示例:有记录 49 38 65 97 76 13 27,我们选择第一个记录作为划分的标准
第一趟:27 38 13 49 97 76 67 //选择的划分标准是49
第二趟:13 27 38 49 76 67 97 //对划分后的27 38 13和97 76 67两部分分别进行排序,再一次选择的划分标准分别是 27 和97
第三趟:13 27 38 49 67 76 97 //因为13 38所在组只有一个数,不必继续排序,而97后面没有数了,也不必继续排序,只有76 67需要继续排序,选择的划分标准76
一个示意图:
快速排序的时间复杂度为O(nlogn),快排被认为是目前最好的一种内部排序算法
C++代码:
//gavin 快速排序 2012-3-24
int Partition ( int * arr , int low , int high ) //划分函数,划分标准为选择第一个记录
{
arr [ 0] = arr [low ]; //数组的第一个位置用来存记录的划分标准
int pivotkey = arr [low ]; // 划分标准
while (low < high )
{
while (low < high && arr [high ] >= pivotkey )
high --;
arr [low ] = arr [high ]; //从high端往前找到第一个比划分标准小的放在arr[low]的位置
while (low < high && arr [low ] <= pivotkey )
low ++;
arr [high ] = arr [low ]; //从low端往后找到第一个比划分标准大的放在arr[high]的位置
}
arr [low ] = arr [ 0] ;
return low ; //返回划分标准的位置
}
void myQuickSort ( int *arr , int low , int high )
{
if (low < high )
{
int pivotloc = Partition (arr ,low ,high ); //整个记录划分为两部分
myQuickSort (arr , low , pivotloc - 1) ; //比划分标准小的部分继续递归排序
myQuickSort (arr , pivotloc + 1,high ); //比划分标准大的部分也继续递归排序
}
}
int Partition ( int * arr , int low , int high ) //划分函数,划分标准为选择第一个记录
{
arr [ 0] = arr [low ]; //数组的第一个位置用来存记录的划分标准
int pivotkey = arr [low ]; // 划分标准
while (low < high )
{
while (low < high && arr [high ] >= pivotkey )
high --;
arr [low ] = arr [high ]; //从high端往前找到第一个比划分标准小的放在arr[low]的位置
while (low < high && arr [low ] <= pivotkey )
low ++;
arr [high ] = arr [low ]; //从low端往后找到第一个比划分标准大的放在arr[high]的位置
}
arr [low ] = arr [ 0] ;
return low ; //返回划分标准的位置
}
void myQuickSort ( int *arr , int low , int high )
{
if (low < high )
{
int pivotloc = Partition (arr ,low ,high ); //整个记录划分为两部分
myQuickSort (arr , low , pivotloc - 1) ; //比划分标准小的部分继续递归排序
myQuickSort (arr , pivotloc + 1,high ); //比划分标准大的部分也继续递归排序
}
}
由于快排的效率比较高,C++的库中已经将这个算法实现了,关于调用C++库中的快排函数,可参考: