您的位置:首页 > 其它

排序算法2---快速排序

2011-03-23 10:45 253 查看
2.quicksort

算法思想:一组无序的数,取某一标杆(标杆为数列中的某个数),任何大于该数的值放在右边,任何小于该数的值放在左边,相等放那边都行。依次类推,每次最少可以排序一个数。从而在有限次后,该数组就可以排序好。

快速排序是目前公认平均情况下算法复杂吧最优的。

平均复杂度: T (n) = O(n )

最差复杂度:Θ
(n
2
)

伪代码:

QUICKSORT(A, p, r)
1 if p < r
2    then q ← PARTITION(A, p, r)
3         QUICKSORT(A, p, q - 1)
4         QUICKSORT(A, q + 1, r)
PARTITION(A, p, r)
1  x ← A[r]
2  i ← p - 1
3  for j ← p to r - 1
4       do if A[j] ≤ x
5             then i ← i + 1
6                  exchange A[i] ↔ A[j]
7  exchange A[i + 1] ↔ A[r]
8  return i + 1


源代码:

void swap(SORT_TYPE *a, SORT_TYPE *b)
{
SORT_TYPE t=*a; *a=*b; *b=t;
}

void quicksort(SORT_TYPE arr[],SORT_TYPE beg,SORT_TYPE end)
{
if (end  >= beg + 1)
{
SORT_TYPE piv = arr[beg], k = beg + 1, r = end;
while (k < r)
{
if (arr[k] < piv)
k++;
else
swap(&arr[k], &arr[r--]);
}
if (arr[k] < piv){
swap(&arr[k],&arr[beg]);
quicksort(arr, beg, k);
quicksort(arr, r, end);
}else {
if (end - beg == 1)
return;
swap(&arr[--k],&arr[beg]);
quicksort(arr, beg, k);
quicksort(arr, r,   end);
}
}
}


注:以上源代码摘自维基百科:
http://zh.wikipedia.org/zh/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
版权归原作者所有,任何非法引用,本人不承担相应法律责任。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: