算法学习:快速排序法

1. 在无序的数组中,先找一个数字(一般找数组的第0个元素)作为基准值key
2. 将比基准值小的放在它的左边,比基准值大的放在它的右边(这样key左边的都比它小,右边的都比它大)
3. 对key左边的数据使用同样的方法进行排序,对key右边的数据也使用同样的方法进行排序,什么叫用同样的方法:递归

问题:如何将比key小的放到左边,比key大的放在右边?

1. 将数组的第0个元素赋值给key(挖坑)
2. 从右边往左边找比key小的填前面的坑(将前面的坑赋值为找到的值),此时后面又挖了一个坑。
3. 从左边往右边找比key大的填后面的坑,此时前面又挖了一个坑
4. 循环2~3步
5. 最后一个坑用key填

/*
	@brief: 快速排序函数
	@param:	int *a接收数组地址
	@param:	int left数组左边的下标
	@param:	int right数组右边一个下标
	@return 无返回值
*/
void quick_sort(int *a, int left, int right)
{
	int n = left;
	int m = right;
	int key = a[n];
	
	if(n >= m)
		return;
	while(n < m)
	{
		//从右边往左边找比key小的值
		while(n < m && a[m] >= key)
			m--;
		//如果找到了要填前面的坑
		if(n < m)
			a[n] = a[m];
		else
			break;
		//从左边往右边找比key大的值
		while(n < m && a[n] <= key)
			n++;
		//如果找到了要填后面的坑
		if(n < m)
			a[m] = a[n];
		else
			break;
	}
	//最后一个坑
	a[n] = key;	//a[m] = key;也可以因为最后一个坑的时候m == n
	//对key左边的部分排序
	quick_sort(a, left, n-1);
	//对key右边的部分排序
	quick_sort(a, n+1, right);
}
int main(void)
{
	int a[] = {9, 6, 2, 4, 6, 4, 0, 6, 2, 0};
	int n = 0;
	int m = sizeof(a)/sizeof(a[0]) - 1;	//m = 10 - 1;
	quick_sort(a, n, m);
	int i;
	for(i = 0; i < 10; i++)
		printf("%d ", a[i]);
	printf("\n");
	
	return 0;
}
发布了50 篇原创文章 · 获赞 5 · 访问量 1531

猜你喜欢

转载自blog.csdn.net/qq_42483691/article/details/104581648