快速排序的基本思想:
首先在数组中选取一个用于比较的基准值,将待排序的记录分为两部分,左侧记录均是小于或等于基准值的,右侧记录均是大于或等于基准值的,然后分别对两部分重复上述操作。
基准值:
1.选取第一个元素
2.选取第一个元素、最后一个元素、中间元素中居中的元素作为基准值,并调到第一个元素 的位置
时间复杂度:快速排序的执行时间取决于递归的深度:
最坏情况:O(n^2) 元素正序或逆序,所有除了基准值以外的所有记录分到基准值的一边。
最好情况:O(nlog2^n) 每次划分,左侧子序列和右侧子序列的元素长度相同.
平均情况:O(nlog2^n)
递归需要的容量(栈来存放):最大容量与递归调用的深度一致,最好情况下为 O(log2^n),最坏情况下要进行 n-1 次递归调用,所以栈的深度为 O(n) ,平均情况下,栈的深度为 O(log2^n) ,快速排序是不稳定的排序方法。
#include<iostream>
using namespace std;
int parti(int first, int last, int data[])
{
int i = first;
int j = last;
int temp;
while (i < j)
{
while (i < j && data[i] <= data[j])
{
--j;
}
if (i < j)
{
temp = data[i];
data[i] = data[j];
data[j] = temp;
++i;
}
while (i < j && data[i] <= data[j])
{
++i;
}
if (i < j)
{
temp = data[i];
data[i] = data[j];
data[j] = temp;
--j;
}
}
cout << "i:" << i << endl;
return i;
}
void quick_sort(int first, int last,int data[])
{
if (first >= last)
{
return;
}
else
{
int mid = parti(first, last,data);
quick_sort(first, mid - 1,data);
quick_sort(mid + 1, last,data);
}
}
int main()
{
int arr[] = {23,13,35,6,19,50,28};
int size = sizeof(arr) / sizeof(int);
quick_sort(0, size - 1, arr);
for (int i = 0; i < size; ++i)
{
cout << arr[i] << " ";
}
return 0;
}