1.快速排序(QuickSort)的基本思想是:通过一次排序后,将原数据分成两个部分,其中一个部分全部比另一个部分都要小或者都要大,然后递归对这两个部分进一步快速排序,最后得到数据的有序序列。
2.算法过程 设待排数组是r[0]...r[n-1],首先任选一个数据(通常是数组的第一个元素)当做监测点。然后将所有小的数据放在他的前面,所有比它大的数据放在后面。最后递归快速排序两边的数据。快速排序不是一种稳定的排序算法。
PS:稳定的排序:冒泡排序,插入排序,归并排序,二叉树排序,桶排序,基数排序。
不稳定的排序:选择排序,希尔排序,堆排序,快速排序。
一趟快排的算法:
(1)设置两个变量i、j,初始时,i=0,j=n-1;
(2)把第一个数据当做监测点,key = r[0];
(3)从j开始向前搜索,找到第一个小于key 的值r[j],将r[j]的值赋给r[i],即r[i]=r[j];
(4)从i开始往后搜索,找到第一个大于key 的值r[i],将r[i]的值赋给r[j],即r[j]=r[i];
(5)重复3,4步,直到i=j,r[i]=key.
3.性能分析
最坏情况下的时间复杂度是O(n^2);
平均及最好情况下的时间复杂度都为O(nlogn);
4.快速排序C++代码:
#include<iostream>
using namespace std;
void QuickSort(int *r,int low,int high)
{
int i = low;
int j = high;
int key=r[low];
if(i>=j)
{
return;
}
while(i<j)
{
while(i<j&&key<=r[j])
j--;//一直向前找,直到找到第一个大于监测点key的值
r[i]=r[j];
while(i<j&&key>=r[i])
i++;//一直向后找,直到找到第一个小于监测点key的值
r[j]=r[i];
}
r[i]=key;
QuickSort(r,low,i-1);
QuickSort(r,i+1,high);
}
int main()
{
int arr[]={1,4,2,5,7,9,3,6,8};
for(int i=0; i<9; i++)
{
cout<<arr[i]<<" ";
}
QuickSort(arr,0,8);
cout<<endl<<"快速排序后:"<<endl;
for(int i=0; i<9; i++)
{
cout<<arr[i]<<" ";
}
return 0;
}