【算法】快速排序

快速排序是一種排序方法,使用快速排序對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]));
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章