快速排序的递归实现。 分治法。

快速排序。

快速排序虽然是一种不稳定的排序方法。(如果排序前有两个相等的数,那么快速排序之后这两个数的相对位置有可能发生改变。) 但是它有其他内排序无法企及的平均性能。

所以对待排序记录个数很大且原始记录随机排列的情况很是适用。

快速排序一般使用分治法来实现。即 先确定一个基准量,然后从尾巴开始比较元素数值和基准量的大小,一旦遇到数值小于基准量的元素就交换位置并从头开始比较......

直到基准量左边元素的数值都不大于它且右边元素数值都不小于它。这样就把整个待排序列分成了两部分,然后两部分分别递归着再次进行上述比较,直到待排序列有序。

代码如下:其中选择数组首元素为基准量。



#include 
#include 

void Quick_Sort (int a[],int pro,int last);   //快排函数声明。形式参量分别为待排序数组、数组首元素下标、末元素下标。


int main(void) {

	int Array[] = {6,43,2,7,3,23,1,4,9};

	int num = sizeof (Array) / sizeof (int);     // 确定数组a[]的元素个数。
	int i;

	Quick_Sort (Array,0,num - 1);                // 调用函数。

	for (i = 0;i < num;i++)
	{
		printf ("%d\n",Array[i]);                //打印。
	}
	return 0;
}


void Quick_Sort (int a[],int pro,int last)
{
	int i,j,val;

	val = a[pro];                          // val 是一个基准量。
	i = pro;
	j = last;

	if (i < j)                             // 用来结束递归的条件。
	{
		while (i < j)
		{
			while (i < j && val < a[j])
			{
				j--;
			}

			if (i < j)
			{
				a[i] = a[j];
				i++;
			}

			while (i < j && val > a[i])
			{
				i++;
			}

			if (i < j)
			{
				a[j] = a[i];
				j--;
			}
		}

		a[i] = val;
		Quick_Sort (a,pro,i-1);
		Quick_Sort (a,i+1,last);
	}
}


你可能感兴趣的:(数据结构。)