快速排序
来源:互联网 发布:sql%rowcount merge 编辑:程序博客网 时间:2024/05/17 06:37
快速排序(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++库中的快排函数,可参考:
http://blog.csdn.net/gavin710/article/details/7391534