算法数据结构笔记 快速排序

本文介绍了一种高效的排序算法——快速排序。通过使用两个指针分别从数组两端开始向中间搜索,将比基准值小的元素放置在左侧,比基准值大的元素放置在右侧。文章详细解释了快速排序的工作原理,并提供了完整的C语言实现代码。

 快速排序通过左右两边各指定一个指针,不断向中间靠拢,如果左边的指针找到比基准点大的,或者右边的指针找到比基准点小的,就把他们交换,基准点一般是数组的第一个的值。

左右指针指向同一个值,就把这个值和基准点交换。我们就找到了基准点本来的的位置;很显然:虽然顺序不对,但他的左边都是比他小的,右边都是比他大的,比如:

4,1,3,6,9,7,8

虽然顺序不对,但注意6这个数字,即使是完全从小到大排列:

1,3,4,6,7,8,9

他还是这个位置。

然后递归调用,慢慢分解,就排序好了。

 

下边是维基百科的图:

 

#include <stdio.h>
#include <stdlib.h>
int *a, t;

void fuck(int left, int right)
{
	if (left > right)
		return;

	int temp = a[left];
	int i = left;
	int j = right;

	while (i != j)
	{
		while (a[j] >= temp && j > i) //必须先从右往左找
			j--;
		while (a[i] <= temp && j > i)//再从左向右找
			i++;

		if (i!=j) //当他们没有没有相时就交换吧
		{
			int k = a[i];
			a[i] = a[j];
			a[j] = k;
		}
	}

	//找到了那个点,把基准点和i交换
	a[left] = a[i]; 
	a[i] = temp;

	fuck(left, j - 1); //递归调用,先搞左边的
	fuck(j + 1, right); //然后递归右边的
}

int main()
{
	int len;
	printf("输入需要排序数字的数量\n");
	scanf_s("%d", &t);
	printf("输入%d个数字吧\n", t);
	a = (int*)malloc(sizeof(int)*t);//为a开辟排序数量的内存
	
	for (int i = 0; i < t; i++)
	{
		scanf_s("%d", &len);
		a[i] = len; //循环读入t个数量
	}

		fuck(0, t - 1); //调用快速排序函数,这是主体。

	for (int i = 0; i < t; i++)
		printf("%d ", a[i]);

	printf("\n");
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值