上一篇文章讲述了交换排序的一种,冒泡排序http://blog.csdn.net/majianfei1023/article/details/7289177,现在讲一讲选择排序的另外一种算法,快速排序。
1.基本思想
假设要排序的数组是Array[0]……Array[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:
1)、设置两个变量i、j,排序开始的时候i = 0,j = n-1;
2)以第一个数组元素作为关键数据,赋值给_temp,即_temp = Array[i];
3)、从j开始向前搜索,即由后开始向前搜索(j=j-1),找到第一个小于_temp的值,两者交换;
4)、从i开始向后搜索,即由前开始向后搜索(i = i+1),找到第一个大于_temp的值,两者交换;
5)、重复第3、4步,直到i=j;
2.算法
1.一次划分算法具体如下:
int QuickSort(Type *Array, int low ,int high)
{
//int m_i;//local variable to store the value of i
Type _tmp;
int i = low;int j = high;
_tmp = Array[i];
while (i!=j)
{
while((Array[j] > _tmp) && (j>i))j--;
if (i<j)
{
Array[i] = Array[j];
i++;
}
while((Array[i] < _tmp) && (i<j))i++;
if (i<j)
{
Array[j] = Array[i];
j--;
}
}
Array[i] = _tmp;
return i;
}
2.快速排序如下:
template<class Type>
void QSort(Type *Array,int low ,int high)
{
if (low < high)
{
int temp = QuickSort(Array,low,high);
QSort(Array,low,temp-1);
QSort(Array,temp+1,high);
}
}
算法分析
快速排序的记录移动次数不大于比较的次数,快速排序的最坏时间复杂度应为O(n*n),最好时间复杂度为O(nlogn);快速排序是一种不稳定的排序方法。