快速排序

算法思想:将一个待排序的表L[1...n]中任取一个元素作为枢纽pivot,然后将所有小于pivot的数据放入L[1...k-1],将所有大于pivot的数据放入L[k+1...n],最后将pivot放入k的位置,这样的一次排序叫做“划分”,分别递归的将左右两个表,再次划分直到每一部分只有一个数据或者空位置,即排序完毕

算法表现取决于递归深度,每次划分越均匀,则递归深度越低。每次划分越不均匀,则递归深度越深。

性能:空间复杂度,最好O(n),最坏O(logn)。

时间复杂度:最好O(nlogn),最坏O(n^2),平均O(nlogn)

稳定性:不稳定


表的划分

int Partition(int A[], int low, int high) //升序
{
	int pivot = A[low];//第一个元素为基准点
	while (low < high) 
	{
		while (low<high && (A[high]>=pivot))high--;//循环向前寻找小于pivot的值
		A[low] = A[high];//比枢纽小的放在前头
		while (low < high && (A[low] <= pivot))low++;
		A[high] = A[low];//比枢纽大的放在后头	
	}
	A[low] = pivot;//也可以使用high,因为最后指向同一个位置,枢纽元素放在两个表中间
	printf("此次划分结果为:");
	for (int i = 0; i < 8; i++) 
	{
		printf("%d ", A[i]);
		if (i == 7)printf("\n");
	}
	return low;//返回枢纽的位置
}

分别用low,high指针指向每一次划分表的第一个元素与最后一个元素,并将第一个元素第一个元素设置为基准点。判断若high>low则循环,若high所指向的数据大于pivot则high--反复向前寻找,若找到则退出循环将high所指向的数据放入low的位置。再从low的位置循环向后找,若找到大于pivot的数据则将它放入high所指向的位置,依次反复,直到high<=low。

快速排序

void QuickSort(int A[], int low,int high)//分别指向表头与表尾
{
	if (low < high) //递归跳出循环的条件
	{
		int pivot = Partition(A, low, high);
		QuickSort(A, low, pivot - 1);//划分左表
		QuickSort(A, pivot+1,high);//划分右表
	}
}

从划分的结果中返回pivot的位置,然后继续划分之后的两个表

全部代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值