排序算法--快速排序

1.简介

分治和递归

三数中值分割

最坏时间为O(N2)

最好时O(NlogN)

平均情况O(NlogN)

2.实现

/*快速排序*/
ElementType Median3(ElementType A[], int Left, int Right)
{
	/*A[left] <= A[Center] <= A[Right]*/
	int Center = (Left + Right) / 2;
	if (A[Left] > A[Center])
	{
		Swap(&A[Left], &A[Center]);
	}
	if (A[Left] > A[Right])
	{
		Swap(&A[Left], &A[Right]);
	}
	if (A[Center] > A[Right])
	{
		Swap(&A[Center], &A[Right]);
	}

	/* 将枢纽元移到Right-1处 */
	Swap(&A[Center], &A[Right - 1]);
	return A[Right - 1];
}

#define Cutoff (3)
void Qsort(ElementType A[], int Left, int Right)
{
	int i, j;
	ElementType Privot;

	if (Left + Cutoff <= Right)
	{
		Privot = Median3(A, Left, Right);
		i = Left; j = Right - 1;
		for (;;)
		{
			while (A[++i] < Privot){}
			while (A[--j] > Privot){}
			if (i < j)
			{
				Swap(&A[i], &A[j]);
			}
			else
				break;
		}

		Swap(&A[i], &A[Right - 1]);
		Qsort(A, Left, i - 1);
		Qsort(A, i + 1, Right);
	}
	else
		/*Do an insertion sort on the small array*/
		InsertionSort(A + Left, Right - Left + 1);
}

void Quicksort(ElementType A[], int N)
{
	Qsort(A, 0, N - 1);
}

  

posted @ 2016-10-20 16:57  mCat  Views(182)  Comments(0)    收藏  举报