zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序算法


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

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

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


    这是小睿的博客,如果需要转载,请标注出处啦~ヾ(≧▽≦*)o谢谢。
  • 相关阅读:
    Swift入门篇-Hello World
    Swift入门篇-swift简介
    Minecraft 插件 world edit 的cs 命令
    搭建本地MAVEN NEXUS 服务
    MC java 远程调试 plugin 开发
    企业内部从零开始安装docker hadoop 提纲
    javascript 命令方式 测试例子
    ca des key crt scr
    JSF 抽象和实现例子 (函数和属性)
    form 上传 html 代码
  • 原文地址:https://www.cnblogs.com/Yunrui-blogs/p/11944057.html
Copyright © 2011-2022 走看看