• 快速排序


    快速排序算法


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

    快速排序是从冒泡排序演变而来的算法,但是比冒泡排序效率高很多。快速排序之所以快速,因为其同归并排序一样用了分治法的思想,同冒泡法一样,快速排序也是属于交换排序的一种,通过元素之间的比较和交换顺序来达到排序的目的。而对于冒泡法不同的是,他采用了分治法,从而在每一轮的挑选基准中,把大的丢到比基准大的一边,而小的丢到另一边。从而把数组拆分成了两个部分。如果是极端的情况,那么快速排序可能退化成冒泡排序,也就是基准选择不对的情况,那么其复杂度从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谢谢。
  • 相关阅读:
    如何在ASP.NET Core中使用JSON Patch
    IDEA中Maven依赖更新问题 国
    vue实现文字上下滚动效果
    mac 安装 homebrew 超快镜像
    linux查找文件命令有哪些
    Git 操作的 token 验证
    mysql重置主键
    PHP获取特定字符串中间的内容
    MySQL 连接出现 Authentication plugin ‘caching_sha2_password‘ cannot be loaded
    oracle mysql sqlserver三种数据库的查看索引和新增普通索引sql语句
  • 原文地址:https://www.cnblogs.com/Yunrui-blogs/p/11944057.html
Copyright © 2020-2023  润新知