快速排序是一種排序方法,使用快速排序對n個數字進行排序,在最壞情況下對運算時間爲O(n*n)。但是由於平均情況下,運算時間比較低爲O(nlgn),並且可以實現就地排序,所以 快速排序是經常用到的比較實用的排序方法。
快速排序使用分治的方法進行排序。對於長度爲n的數組A[],快速排序依據數組元素的大小,把小於A[n-1]和大於A[n-1]的部分分爲兩部分分別排序。採用遞歸的方法完成排序。其過程如下:
quick_sort(int a[], int p, int r)
if p < r
then
q = partition(a,p,r)
quick_sort(a,p,q-1)
quick_sort(a,q+1,r)
其中partition(即分組)的過程如下:
partition(int a[],int p, int r)
i = p-1,x = a[r]
for j=p---->r
if a[j] <= a[r]
then
i++
swap(a[j],a[i])
swap(a[i+1],a[r])
return i+1;
C代碼如下:
#include <stdio.h>
void swap(int * x,int * y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int partition(int a[],int p,int r)
{
int i = 0,j = 0;
i = p-1;
for(j = p; j < r; j++)
{
if(a[j] <= a[r])
{
i++;
swap(&a[i],&a[j]);
}
}
swap(&a[i+1],&a[r]);
return i+1;
}
/*-------------------------------*/
/* Fun:快速排序 */
/* param: a[] (i/o) array to sort*/
/* param: p (i) first index of a[]*/
/* param: r (i) last index of a[]*/
void quick_sort(int a[],int p,int r)
{
if(p<r)
{
int q = partition(a,p,r);
quick_sort(a,p,q-1);
quick_sort(a,q+1,r);
}
}
void output(int a[],int length)
{
int i = 0;
for(i = 0; i < length; i++)
{
printf("%d\t",a[i]);
}
}
int main()
{
int a[] = {3,5,8,3,1,6,9,3,5};
quick_sort(a,0,sizeof(a)/sizeof(a[0])-1);
output(a,sizeof(a)/sizeof(a[0]));
}