轻松掌握快速排序

 

目录

 

一、概述

二、快速排序实现

1、双指针法实现分割数组

2、quicksort实现

3、quick sort调用

三、总结


一、概述

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。

步骤为:

  1. 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
  2. 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
  3. 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。

选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。

二、快速排序实现

1、双指针法实现分割数组

这个双指针法实现分割数组可以解决很多问题,其中有个移0问题(把数组中所有的0都移到后面)也可以用这个方法解决。

int partionArray(std::vector<int> &vecNums, int left, int right,int pvIndex)
{

	int pvval = vecNums[pvIndex];//保存基准值
	std::swap(vecNums[pvIndex], vecNums[right]);//基准值换到最后
	int storeIndex = left;//指向最后一个满足<= pvval索引的下一个位置,双指针中一个指针
	for (int i = left; i < right; ++i)//i为双指针的第二个指针
	{
		if (vecNums[i] <= pvval)
		{
			std::swap(vecNums[i], vecNums[storeIndex]);
			storeIndex++;
		}
	}

	std::swap(vecNums[storeIndex], vecNums[right]);
	return storeIndex;
}

2、quicksort实现

有了这个partionArray,quicksort就比较容易写出来了。

void quicksort(std::vector<int> &vecNums, int left, int right)
{
	if (right > left)
	{
		int pvIndex = rand()%(right-left+1) +left;//随机选择基准值
		int parIndex = partionArray(vecNums, left, right, pvIndex);
    	quicksort(vecNums, left, parIndex - 1);
		quicksort(vecNums, parIndex + 1, right);

	}
}

3、quick sort调用

int main()
{	
    std::vector<int> vecNums = { 2,4,9,1 };
	quicksort(vecNums, 0, vecNums.size() - 1);

	return 0;
}

三、总结

    这里的关键是partionArray的双指针方法,大家可以重点掌握,这个方法可以用来解决一系列的问题。

猜你喜欢

转载自blog.csdn.net/kupe87826/article/details/105955761
今日推荐