ref
博客
算法复杂度
O(N*logN)
步骤:
1.选基数
2.分两边,小于基数在左,大于基数的在右。
3.递归法处理。
1. 选基数
最简单的方式,选择最左边或最右边的数。
2. 分两边
就像手里拿着一个苹果做尺子,对一排苹果分成大小两排一样。最后把手里这个苹果放在中间。
基本思路:
以基数为基准,从两头分别向中间寻找。右边小的放左边,左边大的放右边。并不断靠拢,直到碰头。
(比如基数选择的最左边的数,拿在手里比较。那么先从右边开始找比它小的,因为它的左边没有数。)
具体例子看博客介绍的挖坑填坑法很形象,好理解。
code
/*对一个序列做分两边*/
template<class T>
int AdjustArray(T *a, int l, int r)
{
int i = l, j = r;
T key = a[l];
while (i < j)
{
while (j > i&&a[j] >= key)
{
j--;
}
if (j > i)
{
a[i++] = a[j];
}
while (i < j&&a[i] < key)
{
i++;
}
if (i < j)
{
a[j--] = a[i];
}
}
a[i] = key;
return i;
}
3. 递归
上一步把一个序列分成了大小两边,随后就是对两边重复这个分边的过程。因此使用递归,分别处理左右两边的新序列。直到分边分不下去了(左边或右边没有数了)。
可以通过设想最小的数就是第一个,此时第一次分边左侧就没有新序列,所以下次递归只处理右边的序列。
code
template<class T>
void Quicksort(T *a, int l,int r)
{
if (l<r)//为了排除首尾出现最小或最大的情况,下标溢出
{
int i=AdjustArray(a, l, r);
Quicksort(a, l, i - 1);
Quicksort(a, i + 1, r);
}
}
4. 总体程序
按步骤分成两个子函数。
#include <iostream>
using namespace std;
template<class T>
int AdjustArray(T *a, int l, int r)
{
int i = l, j = r;
T key = a[l];
while (i < j)
{
while (j > i&&a[j] >= key)
{
j--;
}
if (j > i)
{
a[i++] = a[j];
}
while (i < j&&a[i] < key)
{
i++;
}
if (i < j)
{
a[j--] = a[i];
}
}
a[i] = key;
return i;
}
template<class T>
void Quicksort(T *a, int l,int r)
{
if (l<r)//为了排除首尾出现最小或最大的情况,下标溢出
{
int i=AdjustArray(a, l, r);
Quicksort(a, l, i - 1);
Quicksort(a, i + 1, r);
}
}
int main()
{
int a[6] = { 0,2,1,4,3,77 };
Quicksort(a, 0,5);
for (int i = 0; i < 6; i++)
{
cout << a[i] << " ";
}
system("Pause");
return 0;
}
两个函数写成一个
#include <iostream>
using namespace std;
template<class T>
void AdjustArray(T *a, int l, int r)
{
int i = l, j = r;
T key = a[l];
while (i < j)
{
while (j > i&&a[j] >= key)
{
j--;
}
if (j > i)
{
a[i++] = a[j];
}
while (i < j&&a[i] < key)
{
i++;
}
if (i < j)
{
a[j--] = a[i];
}
}
a[i] = key;
}
template<class T>
void Quicksort(T *a, int l,int r)
{
if (l<r)//为了排除首尾出现最小或最大的情况,下标溢出
{
int i = l, j = r;
T key = a[l];
while (i < j)
{
while (j > i&&a[j] >= key)
{
j--;
}
if (j > i)
{
a[i++] = a[j];
}
while (i < j&&a[i] < key)
{
i++;
}
if (i < j)
{
a[j--] = a[i];
}
}
a[i] = key;
Quicksort(a, l, i - 1);
Quicksort(a, i + 1, r);
}
}
int main()
{
int a[6] = { 0,2,1,4,3,77 };
Quicksort(a, 0,5);
for (int i = 0; i < 6; i++)
{
cout << a[i] << " ";
}
system("Pause");
return 0;
}