快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
方法一:
注:在数组的左右两边定义两个指针,分别指向数组的最前面和最后面,当其那面的left指向的数据大于key值,那么right从后面向前面寻找第一个小于key值的数据,当left
int pation3(int * arr,int left,int right)
{
if(NULL == arr)
return -1;
int key = arr[right];
int cur = right;
while(left < right)
{
while(left < right && arr[left] > key)
left++;
while(left < right && arr[right] < key)
right--;
if(left < right)
swap(arr[left] ,arr[right]);
left ++ ;
right--;
}
swap(arr[right + 1],arr[cur]);
return right+1;
}
void fastsort(int* arr,int left ,int right)
{
if(left < right)
{
int key = pation3(arr,left,right);
fastsort(arr,left,key-1);
fastsort(arr,key+1,right);
}
}
方法二:挖坑法
注:定义两个指针,分别指向数组的最其前面和最后面的元素,在key里面保存数组里面的最后一个元素,那么left从前面向后面查找第一个大于key值的值,并将left对应的值赋给right对应的值,再从right从后面向前面走,找到第一个小于key值的值,并且将right里面的值赋给left,当left>right的时候循环终止。
实现代码:
template<class T>
int pation(T* arr,int left,int right)
{
if(NULL == arr)
return -1;
int tmp = arr[right];
int begin = left;
int end = right;
while(begin < end)
{
while(begin < end && arr[begin] < tmp)
begin++;
if(begin < end)
arr[end] = arr[begin];
while(begin < end && arr[end] > tmp)
end--;
if(begin < end )
arr[begin] = arr[end];
begin++;
end--;
}
arr[end+1] = tmp;
return end+1;
}
方法三:
注:定义两个指针,cur指向left,pre指向left前面的位置,cur一直向后走,当找到第一个大于key的值的时候将cur和pre里面的值进行互换,当cur
template<class T>
int pation4(T * arr,int left,int right)
{
if(NULL == arr)
return -1;
int cur = left;
int pre = cur-1;
T key = arr[right];
while(cur < right)
{
if(cur != pre && arr[cur] > key)
swap(arr[++pre],arr[cur]);
cur++;
}
swap(arr[pre+1],arr[right]);
return pre+1;
}
以上三种调用代码如下:
template<class T>
void fastsort(T* arr,int left ,int right)
{
if(left < right)
{
int key = pation4(arr,left,right);
fastsort(arr,left,key-1);
fastsort(arr,key+1,right);
}
}