快速排序算法策略
- 分解:选择数组a中的一个元素q作为基准,把数组划分为三段a1<q,a2=q和a3>q。
- 递归:对数组a1,a2递归调用快速排序算法。
- 合并:不需要额外操作
快速排序法时间复杂度分析
1、最优情况
每次都刚好在中间。
解递归方程得:
2、最坏情况
解递归方程得:
3、平均情况
算法图解
第一步:
1、选择第一个元素41作为标准。
2、指针i从左边开始寻找比41大的元素,找到67。
3、指针j从右边寻找比41小的元素,找到24。
4、交换24和67,继续寻找,直到i>j,跳出循环。
5、交换41和j当前指向的元素0.
第二步:
1、41的位置已经正确。
2、对数组0、24、34和69、67、78、58、62、64按照第一步的方法排序。
第三步:
1、0、41、69、78的位置正确。
2、对24、34和67、64、58进行排序
第四步:
1、0、24、34、41、58、62、69、78位置正确。
2、对64、67排序。
算法C++实现
void quicksort(int a[], int q, int r);
int partition(int a[], int q, int r);
void quicksort(int a[], int q, int r)
{
if (q < r)
{
int p = partition(a, q, r);//left part < target | target | right par > target
quicksort(a, q, p - 1);//sort left part
quicksort(a, p + 1, r);//sort right part
}
}
int partition(int a[], int q, int r)
{
int i = q;
int j = r;
int target = a[q];
while (true)
{
i++;
while (a[i] < target && i < r)//Find a[i] >= target
{
i++;
}
while (a[j] > target)//Find a[j] <= target
{
j--;
}
if (i >= j) break;
int temp = a[j];//Swap a[i], a[j]
a[j] = a[i];
a[i] = temp;
}
int temp = a[j];//Swap a[j], target
a[j] = a[q];
a[q] = temp;
return j;
}
void main()
{
#define length 10 //Length of the original array
int a[length] = {};
int b[length] = {};
for (int i = 0; i < length; i++)//Generate the original array
{
a[i] = rand() % 100;
}
for (int i = 0; i < length; i++)//print the original array
{
cout << a[i] << " ";
}
cout << endl;
quicksort(a,0, length-1);//sort the array
for (int i = 0; i < length; i++)//print the sorted array
{
cout << a[i] << " ";
}
system("pause");
}
运行结果如下