快排总结00

基于六大基本排序的学习:
快速排序
废话不多说直接上代码

void quick_sort(int left,int right,int* arr)
{
	if(left >= right)
	 return;
	int i = left;
	int j = right;
	int base = arr[left];
	while(i < j)
	{
		while(arr[j] >= base && i < j)
		 j--;
		while(arr[i] <= base && i < j)
		 i++;
		if(i < j)
		{
			int temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
	}
	arr[left] = arr[i];
	arr[i] = base;
	quick_sort(left,i-1,arr);
	quick_sort(i+1,right,arr);
}

然后我们一步一步解析理解:
首先是形参,形参内我们运用left,right来指向数组的开始与结束端。
然后是函数体内:
由于快排应用的是递归算法,所以要有一个递归的出口,即当最左端大于等于最右端时,函数就从此截止,然后依次结束之前的递归。
然后找一个i和j使其分别等于left与right,再找一个“准基数”,这里我们常用的准基数就是arr[left],然后就是进行最主要的算法。
首先的大循环条件是当 i < j,这里的意思最左端不能等于或超过最右端,其实是为了i == j作铺垫,然后小循环中***一定要先进行 j-- 的操作***。
j–的操作条件就是从这个数组的right开始,从后向前遍历找到一个小于等于准基数base的数值***并且要求此时的 j >= i***,然后停留在此;
i++的操作条件与其类似,不过是找到一个大于等于准基数base的数,并且要求此时的 i <= j ,然后停留在此。然后判断此时的 i 是否真的小于 j,如果判断为真的话,将位于 i 和位于 j 位置上的数值交换。重复上述步骤,直到 i == j,然后进行数组起始端数值的改变,将arr[i](或arr[j],因为此时i == j) 赋值给arr[left],再将base赋值给当前的aa[i]。然后进行向左和向右的递归操作。
给个例题

#include<iostream>
using namespace std;
void quick_sort(int left,int right,int* arr)
{
	if(left >= right)
	 return;
	int i = left;
	int j = right;
	int base = arr[left];
	while(i < j)
	{
		while(arr[j] >= base && i < j)
		 j--;
		while(arr[i] <= base && i < j)
		 i++;
		if(i < j)
		{
			int temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}
	}
	arr[left] = arr[i];
	arr[i] = base;
	quick_sort(left,i-1,arr);
	quick_sort(i+1,right,arr);
}

int main()
{
	const int n = 10;
	int a[n];
	for(int i = n-1;i>=0;i--)
	{
		a[i] = i*i - 3*i + 3;
	}
	for(int i = 0;i<n;i++)
	 cout<<a[i]<<" ";
	cout<<endl;
	quick_sort(0,n-1,a);
	for(int i = 0;i<n;i++)
	 cout<<a[i]<<" ";
}

得出的结果是

在这里插入图片描述

我现在只解释一下第一次循环
首先base = arr[left] = 3;
然后i = 0,j = n - 1 = 9;
从j开始从后往前遍历
j一直减到了2
然后i开始从前往后遍历,当i等于2时虽然没找到大于等于base的数,但由于i再增加导致了i > j,所以i只停留在了2处。然后此时不满足了i < j,所以直接进行arr[left] = a[i]; a[i] = base;的操作,然后进行左右递归,最后发现(也是巧合原因)这个数组只需要进行一次排序即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值