快速排序法:
快速排序法的最坏时间代价为O(n2),最坏空间代价为O(n);
最优和平均时间代价为O(nlogn),空间代价为O(logn);
快速排序法采用分治的思想,取定一个轴值,此处取中间值,然后将该值放于临时变量temp中,然后将最右边的值放于中间位置处,此时,最右边的位置便空闲出来索引为jIndex,最左边的索引为iIndex初始为0
然后就从左边iIndex处开始向右找大于temp的数,每次iIndex自加1,当找到时,将其值放于jIndex处,然后jIndex--,从jIndex开始从右往左找小于temp的数,当iIndex与jIndex相等时,在iIndex处放置temp值,此时temp值左边的值均小于temp,temp值右边的值均大于temp,然后递归排序temp左边和右边的序列即可
快速排序算法的优化主要可以从轴值的选取和递归着手,其中递归可以通过以下方式优化:
对于快速排序算法,每次递归均会开辟一块空间,因此当序列长度较小时,可以不再排序,最后将序列用插入排序法排列一次即可
快速排序法的最坏时间代价为O(n2),最坏空间代价为O(n);
最优和平均时间代价为O(nlogn),空间代价为O(logn);
快速排序法采用分治的思想,取定一个轴值,此处取中间值,然后将该值放于临时变量temp中,然后将最右边的值放于中间位置处,此时,最右边的位置便空闲出来索引为jIndex,最左边的索引为iIndex初始为0
然后就从左边iIndex处开始向右找大于temp的数,每次iIndex自加1,当找到时,将其值放于jIndex处,然后jIndex--,从jIndex开始从右往左找小于temp的数,当iIndex与jIndex相等时,在iIndex处放置temp值,此时temp值左边的值均小于temp,temp值右边的值均大于temp,然后递归排序temp左边和右边的序列即可
#ifndef RAPIDSORT_H
#define RAPIDSORT_H
#include <iostream>
using namespace std;
template<typename T>
class RapidSort{
public:
void rapidSort( T*,int );
void printArr( T*,int );
};
/**
* 递归实现快速排序法
*/
template<typename T> void RapidSort<T>::rapidSort( T *sortedArr,int arrLength )
{
if( arrLength==1 || arrLength==0 )
return;
int lIndex=0,rIndex=arrLength-1;
int middle=( lIndex+rIndex )/2;
int temp=sortedArr[middle];
sortedArr[middle]=sortedArr[rIndex];
bool ltor=true;
while( lIndex!=rIndex )
{
if( ltor )
{
if( sortedArr[lIndex]>temp )
{
sortedArr[rIndex--]=sortedArr[lIndex];
ltor=false;
}
else
++lIndex;
}else{
if( sortedArr[rIndex]<temp )
{
sortedArr[lIndex++]=sortedArr[rIndex];
ltor=true;
}
else
--rIndex;
}
}
sortedArr[lIndex]=temp;
// 排序左半部分
rapidSort( &sortedArr[0],lIndex+1 );
// 排序右半部分
rapidSort( &sortedArr[lIndex+1],arrLength-lIndex-1 );
}
template<typename T> void RapidSort<T>::printArr( T *sortedArr,int arrLength )
{
for( int i=0;i<arrLength;++i )
{
cout<<sortedArr[i]<<" ";
}
}
#endif
优化的快速排序算法:
快速排序算法的优化主要可以从轴值的选取和递归着手,其中递归可以通过以下方式优化:
对于快速排序算法,每次递归均会开辟一块空间,因此当序列长度较小时,可以不再排序,最后将序列用插入排序法排列一次即可