快速排序算法

快速排序算法的思想就是:

分治的思想,先找一个基准数然后把大的放在一面小的放在另一面,然后递归继续找,当初大一研究了1个多月没弄懂现在大二学了搜索之后,感觉真的简单,发现有时候有的算法真的需要你的积累再去学,盲目学费时费力,最好是可以先放放等你水平上来在看。

快速排序法 = 分治法 + 挖坑填数


分治法:
大问题分解成各个小问题,对小问题求解,使得问题解决
1.从右向左开始找第一个小于基准数元素
2.从左向右开始找第一个大于基准数的元素
3.继续执行上面俩步


例如:arr[] = { 4, 8 ,9 ,5 ,6 ,3 ,1 ,2 ,0 ,7};


把第一个数当成基准数:arr[0] = 4;

设start = 0, end = 9

然后把arr[0]提取出来,执行第一步从右往左比找到第一个比arr[0]小的元素然后在把这个数放在arr[0]一开始的位置是0,

找的过程中end--,因为最后要把左面放的都是比基准数小的,右面都是大的,所以在遍历判断的时候要strat < end,

然后执行第二步从左往右找第一个比arr[0]大的元素,找到后放到刚刚比arr[0]小的位置,在遍历过程中start++最后重复执行

一直到左面都是比基准数小的右面都是比基准数大的,然后在分别递归左右,把左右的位置传进去,一直到最后排好序为止。

//核心代码

int ll = 0;
void Quick_Sort(int arr[], int start, int end)
{
	if(start >= end)
	{
		return ;
	}
	int i = start;
	int j = end;
	//找一个基准数
	int temp = arr[start];
	if(i < j)
	{
		while(i < j)
		{
			//执行第一步,从右往左找比基准数小的
			while(i < j && arr[j] >= temp)
			{
				j--;
			}
			//如果找完之后不是它本身,那么把这个数放在基准数的左面
			if(i < j)
			{
				arr[i] = arr[j];
				//第一个数放完了然后更新下位置
				i++;
			}
			//执行第二步,从左往右找比基准数大的
			while(i < j && arr[i] < temp)
			{
				i++;
			}
			if(i < j)
			{
				arr[j] = arr[i];
				j--;
			}
		}
		
	}
	cout << " i = " << i << " j = " << j << endl;
	for(int k = 0; k < ll; k++)
	{
		cout << arr[k] << " ";
	}
	cout << endl;
	//排完之后放基准数
	arr[i] = temp;




	//然后左右分别递归
	//左半部分
	Quick_Sort(arr, start, i - 1);
	//右半部分
	Quick_Sort(arr, i + 1, end);	
}




//示例代码:

/*
快速排序法 = 分治法 + 挖坑填数

分治法:
大问题分解成各个小问题,对小问题求解,使得问题解决
1.从右向左开始找第一个小于基准数元素
2.从左向右开始找第一个大于基准数的元素
3.继续执行上面俩步


基准数:arr[0] = 4;
*/


# include <iostream>

using namespace std;

void PrintArray(int arr[], int len)
{
	for(int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}


//快速排序从小到大
void Quicksort(int arr[], int start, int end)
{
	int i = start;
	int j = end;
	//基准数
	int temp = arr[start];
	/*
	第一次从右向左比基准数小的
	大的在基准数右面,小的在基准数左面
	int temp = 4;
	*/
	if(i < j)
	{
		//继续挖坑填数
		while(i < j)
		{
			//从右向左去找比基准数小的
			while(i < j && arr[j] >= temp)
			{
				j--;
			}
			//填坑
			if(i < j)
			{
				arr[i] = arr[j];
				i++;
			}
			//从左向右 找比基准数大的数
			while(i < j && arr[i] < temp)
			{
				i++;
			}
			//填坑
			if(i < j)
			{
				arr[j] = arr[i];
				j--;
			}
		}
		//把基准数放到 i 位置
		arr[i] = temp;
		//对左半部分进行快速排序
		Quicksort(arr, start, i - 1);
		//对右半部分进行快速排序
		Quicksort(arr, i + 1, end);
	}
}





int main(int argc, char *argv[])
{
	int myArr[] = {4, 2, 8, 0, 5, 7, 1, 3, 9};
	int len = sizeof(myArr) / sizeof(int);

	PrintArray(myArr, len);
	Quicksort(myArr, 0, len - 1);
	PrintArray(myArr, len);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值