快速排序

快速排序算法


下面我们来学习快速排序算法。

快速排序是从冒泡排序演变而来的算法,但是比冒泡排序效率高很多。快速排序之所以快速,因为其同归并排序一样用了分治法的思想,同冒泡法一样,快速排序也是属于交换排序的一种,通过元素之间的比较和交换顺序来达到排序的目的。而对于冒泡法不同的是,他采用了分治法,从而在每一轮的挑选基准中,把大的丢到比基准大的一边,而小的丢到另一边。从而把数组拆分成了两个部分。如果是极端的情况,那么快速排序可能退化成冒泡排序,也就是基准选择不对的情况,那么其复杂度从O(nlogn)退化到O(n 2 ),削减了效率。

快速排序大体上看,主要是分为三个步骤

  • 分解
  • 解决
  • 合并
  • 分解: 一个数组假设为ans[p..r],那么被分为ans[p...q-1],ans[q+1...r],而中间的ans[q],使得ans[p...q-1]中的每一个元素都小于或者等于ans[q],ans[q+1...r]中的每一个元素都大于或者等于ans[q]。
  • 解决: 然后通过函数递归调用来解决问题,也就是对数组ans[p...q-1]和ans[q+1...r]进行排序
  • 合并: 数组都是在原来的基础上进行排序,所以合并操作在解决的时候已经算是一种合并了。故不需要合并操作

以上便是基本的介绍快速排序的基本思想和解决方法


来看一个动态的图示演例

dynamic


代码


#include<iostream>
#include<vector>
#include<cstdlib>
#include<time.h>
using namespace std;

double QuickSort(vector<int>& ans, int p, int r);
int Parrtition(vector<int>& ans, int p, int r);
void Swap(int& a, int& b);
void Display(vector<int>& ans);

int main()
{
	int number;
	cout << "请输入个数" << endl;
	cin >> number;
	vector<int>array;//数组array
	//随机取Number个数字
	for (int i = 0; i < number; i++)
	{
		srand(time(nullptr)+i);
		array.push_back(rand() % 1000);
	}
	cout << "排序前的情况:" << endl;
	
	Display(array);//显示排序前的情况
	
	cout << "排序所用时间:" << QuickSort(array,0,array.size()-1)<<"ms"<<endl;
	
	cout << endl << "排序后的情况" << endl;
	Display(array);

	return 0;
}

double QuickSort(vector<int>& ans, int p, int r)
{
	clock_t start, end;
	start = clock();
	if (p < r)
	{
		int q;
		q = Parrtition(ans, p, r);
		QuickSort(ans, p, q - 1);
		QuickSort(ans, q + 1, r);
	}
	end = clock();
	return (double)(end - start);
}

int Parrtition(vector<int>& ans, int p, int r)
{
	int x = ans[r];
	int i = p - 1;
	for (int j = p; j < r; j++)
	{
		if (ans[j] <= x)
		{
			i++;
			Swap(ans[i], ans[j]);
		}
		
	}
	Swap(ans[i + 1], ans[r]);
	return i + 1;
}

void Swap(int &a, int &b)
{
	int t;
	t = a, a = b, b = t;
}

void Display(vector<int>& ans)
{
	for (int i = 0; i < ans.size(); i++)
		cout << ans[i] << " ";
	cout << endl << endl;
}


参考《算法导论》,图来自网络


posted @ 2019-11-27 17:47  野生的Lemon柠檬  阅读(188)  评论(0编辑  收藏  举报

呱呱呱呱呱🐸