主要思想:
分治法和递归操作,每一遍操作都是根据其中一个数n将数组分成两个部分,一个部分全是大于n的,另外的那部分全是小于n的。然后再对两个部分递归进行同样的操作,直到数组个数为1时结束。
算法复杂度:
最坏情况:O(n^2)
平均情况:O(nlgn)
实现代码:
#include <iostream>
void quickSort(int a[],int left,int right)
{
//退出条件
if(left>=right)
return;
int i,j;
i = left;
j = right;
//保存最左边的元素
int tmp = a[i];
do
{
//从右向左找第一个小于tmp的值,然后放到i位置
while(a[j]>tmp && i<j)
j--;
if(i<j)
{
a[i] = a[j];
i++;
}
//从左向右找第一个大于tmp的值,然后放到j位置
while(a[i]<tmp && i<j)
i++;
if(i<j)
{
a[j] = a[i];
j--;
}
}while(i!=j);
//恢复tmp
a[i] = tmp;
//递归处理基准点左边部分和右边部分
quickSort(a,left,i-1);
quickSort(a,i+1,right);
}
int main()
{
int a[8] = {33,23,1,56,3,9,45,66};
std::cout<<"排序前:";
for(int i=0;i<8;i++)
std::cout<<a[i]<<" ";
std::cout<<std::endl;
std::cout<<"排序后:";
quickSort(a,0,7);
for(int i=0;i<8;i++)
std::cout<<a[i]<<" ";
std::cout<<std::endl;
}