C/C++实现快速排序

快速排序算法(quickSort)是最常用的排序算法之一。关于其思想讲解建议参考:JULY的版本

文章的思想简而言之就是:分治法 + 挖坑填坑

我简单按照(1)存储数组首数字(2)从后向前比较(3)从前向后比较。这样的顺序写了一个版本:

void quickSort(int* arr, int start, int end)
{
	if(start == end) return;
	
	int key = arr[start];
	int head = start;
	int tail = end;
	while(head != tail)
	{
		while(key < arr[tail]) tail--;
		arr[head] = arr[tail];
		head++;

		while(key > arr[head]) head++;
		arr[tail] = arr[head];
		tail--;
	}
	// 此时,head == end
	quickSort(arr, start, head - 1);
	quickSort(arr, head + 1, end);
	return;
}

卧槽完全不对好么,死循环。

检查后发现,是因为自己没有注意到因为key保存了一个值,此时的数组中并没有key值(数组值在动态改变。判断内层while的终点错误。

如果加上 head < tail 的限制。如此一来,while后的操作也该有所选择。

而且,因为当迭代范围仅剩一个数时,quickSort(arr, start, head - 1); 中start > head - 1,无法跳出迭代。同理,quickSort(arr, head + 1, end); 也是。迭代终点需要修改。

最后,key根本没有放回数组。。。

(1)此时,如果不把key值放回数组。则修改之后的代码为:

void quickSort(int* arr, int start, int end)
{
	if(start >= end) return;
	
	int key = arr[start];
	int head = start;
	int tail = end;
	while(head != tail)
	{
		while(key < arr[tail] && head < tail) tail--;
		if(head < tail)
		{
			arr[head] = arr[tail];
			head++;
		}

		while(key > arr[head] && head < tail) head++;
		if(head < tail)
		{
			arr[tail] = arr[head];
			tail--;
		}
	}
	// 此时,head == end
	arr[head] = key;
	quickSort(arr, start, head - 1);
	quickSort(arr, head + 1, end);
	return;
}

(2)但是,如果把key值放回数组呢?

每次修改及时将key放回,如果head == tail,禁止进行head++或者tail--操作,及时break保存现场)。代码如下:

void quickSort(int* arr, int start, int end)
{
	if(start >= end) return;
	
	int key = arr[start];
	int head = start;
	int tail = end;
	while(head != tail)
	{
		while(key < arr[tail]) tail--;
		if(head == tail) break;
		arr[head] = arr[tail];
		arr[tail] = key;
		head++;

		while(key > arr[head]) head++;
		if(head == tail) break;
		arr[tail] = arr[head];
		arr[head] = key;
		tail--;
	}
	// 此时,head == end
	arr[head] = key;
	quickSort(arr, start, head - 1);
	quickSort(arr, head + 1, end);
	return;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值