基本思想:
任取一个元素为中心,比它小的往前放,比他大的往后放,形成两个子表,再将两个子表重复上述步骤,最后子表只剩一个元素,排序结束。(递归)
具体步骤:
- 取第一个数位中心元素,下标为0作为哨兵(暂时存放中心元素,排序下标为1~n的元素)。
- 从High开始比较,如果data[High]比中心元素大,循环执行--High
- 当data[High]小于中心中心元素时,把High位上的数移至Low位。并且进行Low++,下一次比较从data[Low]开始
- 当data[Low]小于中心元素时,循环执行++Low,当data[Low]小于中心元素时,Low位上的数移至High位,再进行High--,下一次又从data[High]开始比较。
- 重复以上步骤,当Low=High时停止,把data[0](中心元素)移至Low位,这样就形成了左边都小于中心元素,右边都大于中心元素的两部分,再将两部分重复1,2,3,4步骤,直到每个子表只剩一个元素
C代码实现:
/***************************************************************************
*参数:
* data:待排序数组
* Start:数组起始下标,下标0不作为数据进行排序,所以从1开始
* End:最后一个数据下标
*************************************************************************/
void QuickSort(int *data,int Start,int End)
{
if(Start >= End)//如果长度小于1则返回
return;
int Low = Start,High = End;
int CenterDataPosition; //中心点元素位置
data[0] = data[Low]; //取第一个元素为中心
while(Low < High)
{
while(data[High] >= data[0] && Low < High) {--High;} //当处于High的数大于data[0]时,说明在中心元素右边,不进行移动,进行High--
data[Low] = data[High]; //一旦有元素小于data[0],说明该元素中心元素左边,将它移至data[Low]
while(data[Low] <= data[0] && Low < High) {++Low;} //与上同理
data[High] = data[Low];
}
data[Low] = data[0]; //当low与high重合说明元素比较完成,low和high指向同一位置,该位置为空,将中心元素移动到此
CenterDataPosition = Low; //中心元素位low或high,因为high = low
QuickSort(data,Start,CenterDataPosition-1); //对子表1再重复操作
QuickSort(data,CenterDataPosition+1,End); //对子表2.......
}
算法分析:
- 时间复杂度:平均情况:
,所有内排序算法中最好的
- 空间复杂度:平均需要的空间:
的栈空间,最坏
- 快速排序是不稳定排序,即两个相同的数可能交换位置。
如果错误,请多指正!