快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
快速排序原理图
了解了原理,让我们直接上代码吧
//快速排序
template<typename T>
void quickSort(T arr[], int n)
{
__quickSort(arr, 0, n - 1);
}
//对arr[l, r] 部分进行快速排序
template<typename T>
void __quickSort(T arr, int l, int r)
{
if(l >= r) return;
int p = __partition(arr, l, r);
__quickSort(arr, l, p-1);
__quickSort(arr, p+1, r);
}
// 对arr[l, r]部分进行partition操作
// 返回p,使得arr[l, p - 1] < arr[p] ; arr[p+1, r] > arr[p]
template<typename T>
int __partition(T arr[], int l, int r)
{
T v = arr[l];
// arr[l+1, j] < v arr[j+1, i) > v
int j = l; //设置 j 的初始值为l,就是保证刚开始小于v的子数组为空
for(int i = l + 1; i <= r; i++) // 设置 i 的初始值为l + 1,就是保证刚开始大于v的子数组为空
{
if(arr[i] < v)
{
swap(arr[j + 1], arr[i]);
j++;
}
}
swap(arr[l], arr[j]);
return j;
}
下一篇,将对快速排序进行优化~~