快速排序
算法原理:在待排序数组里选择一个基准,根据这个基准将数组分成两个部分,第一个部分小于这个基准,第二个部分大于这个基准。继续对这两个部分进行排序,以达到整个序列有序。
void QuickSort(int a[], int start, int end){
if(start > end || a.length<1 || start < 0 || a.length < end)
return;
int temp=a[start];
int te;
int i = start, j=end;
while (i<j){
while(i<j && a[j] > temp)
j--;
while(i<j && a[i] < temp)
i++;
if(i<j){
te = a[i];
a[i] = a[j];
a[j] = te;
}
}
te = a[i];
a[i] = temp;
a[start] = te;
QuickSort(a, start, i-1);
QuickSort(a, i+1, end );
}
时间复杂度:最优情况下,基准每次都划分得很均匀,如果排序n个关键字,则需递归log2n次, 每次需要比较的次数分别为n, n/2, n/4等等,所以最优情况下,排序算法的时间复杂度为O(nlogn).
最坏情况下,当待排序的序列为正序或逆序排列时,每次划分只得到一个比上一次划分少一个记录的子序列。此时需要执行n-1次递归调用,比较次数分别为1,2,3,...,n-1,n(n-1)/2,即算法的时间复杂度为O(n^2)