排序算法之快速排序

来源:互联网 发布:什么是微观数据 编辑:程序博客网 时间:2024/05/22 08:01
A,快速排序:通过一趟排序将待排序序列A划分成两个独立的序列B和C,其中B中的每个元素都小于或等于C中的任何一个元素,然后再按照此方法分别对B和C进行排序。
B,一趟快排过程:
1)假设待排序元素个数为n,设置两个位置指针变量i和j,初始值i=0,j=n-1;
2)赋值key=array[i](其中i=0)作为关键数据;
3)从后往前遍历序列元素,--j,直到遇到第一个array[j]
4)接着从位置i开始往后遍历,++i,直到遇到第一个array[i]>key,交换array[i]与array[j],然后--j;
5)重复步奏 3)和4),直到i=j时一趟排序结束,此时以key为分界线,key左边元素均小于或等于key右边的元素值。
下图为一组乱序元素序列的一趟快速排序过程:
排序算法之快速排序

C,算法实现:
#include "iostream"
using namespace std;
int main()
{
void sort(int[], int, int);
int array[] = {6,3,9,15,7,1,12,4,2};
int n = sizeof(array)/sizeof(int*);
sort(array, 0, n-1);
for(int i = 0; i < n; ++i)
cout<<array[i]<<" ";
cout<<endl;
return 0;
}
//快速排序
//array表示测试序列,low表示序列中第一个元素下标,high表示最后一个元素下标
void sort(int array[], int low, int high)
{
//key为关键字,temp为交换位置时的临时变量
int key = array[low], i = low, j = high,temp;
//递归的结束条件
if(low >= high)
return;
while(i < j)
{
//从j指向的位置起向后遍历,直到遇到第一个array[j]
while(array[j] > key && j > i)
--j;
//交换array[i]和array[j],s此时array[j]=key
if(j > i)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
++i;
}
//从i指向的位置起往后遍历,直到遇到第一个array[i]>key
while(array[i] < key && i < j)
++i;
//交换array[i]和array[j],s此时array[i]=key
if(i < j)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
--j;
}
}
//以key为分界线分别对左右子序列进行同样的过程,它的对应下标为i或j(i=j)
sort(array, low, i-1);
sort(array, i+1, high);
}
运行结果为:

排序算法之快速排序
D,复杂度分析
(a)时间复杂度:
 1)如果初始序列为降序或者升序排列,每一趟元素都只在了一边而另一边元素个数为零,此时T(n)=T(n-    1)+T(1)+O(n),其中O(n)为将序列分成左右两部分的时间复杂度,最坏情况下比较次数为,因此最坏时间复杂为O(n^2)。
 2)如果每次左右两边元素个数差不多一样,此时最好T(n)=2T(n/2)+O(n),由Master公式得最好时间复杂度为O(nlogn);
 3)综上所述,快熟排序最坏时间复杂度为O(n^2),最好时间复杂度为O(nlogn)。
0 0