【数据结构】快速排序

hoare法

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>


void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}


int Part_Sort(int* arr,int left,int right)
{
	int key = arr[left];//选取左边第一个为基准值
	int keyi = left;

	while (left<right)
	{
		//为什么要right先移动?
		//首先我们的基本思想是让小于基准值的元素都放到左边,大于基准值的元素都放到右边;
		//因为right找小于key的值,如果left先移动的话,当left停下来,然后right移动最后相遇的时候,
		//很可能right一口气跑到了left的位置导致arr[right]>key,
		//如果交换的话,则不符合快排思想。


		while (left < right && arr[right] >= key) right--;//只要right停下来,arr[right]不是小于key就是left和right相遇了;
		while (left < right && arr[left]  <= key) left++;//只要left停下来,arr[left]不是大于key就是left和right相遇了;
		if(left!=right)    swap(&arr[left], &arr[right]);       //left==right没必要交换
		

	}

	if (right!=keyi) swap(&arr[right],&arr[keyi]);//确认最后left确实移动了,即left!=keyi;
	return right;
}

//时间复杂度O(nlogn),空间复杂度O(1)
void Quick_Sort(int* arr, int left,int right)
{
	if (left >= right) return;
	int keyi = Part_Sort(arr, left, right);//返回值是left和right相遇的下标;

	//优化,三数取中;
	Quick_Sort(arr,left,keyi-1);
	Quick_Sort(arr,keyi+1,right);
}



int main()
{
	int array[10] = { 10,9,8,7,6,5,4,3,2,1 };
	Quick_Sort(array,0,9);
	for (auto& e : array)
	{
		std::cout << e << std::endl;
	}





	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值