快速排序的学习(基于Go)

快速排序中的算法思想

1. 分治思想

分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

我们可以利用分治思想将杂乱无序的数组Arr[p,,r]分为以下几个步骤

1.分解:

在数组Arr[p,,r]中找出主元x,并且依据这个x对原始的数组进行分解成两个数组Arr[p,,,q - 1]和Arr[q + 1,,r]是的任何一个属于Arr[p,,,q - 1]的元素都要小于Arr[q]

任何一个属于Arr[q + 1,,r]的元素都要大于Arr[q]

2.进行递归求解:

通过递归调用快速排序对子数组Arr[p,,,q - 1]和Arr[q + 1,,r]进行排序

3.组合

因为快速排序是基于原址排序的,所以不需要进行合并操作,也就是说此时的数组已经排好序了

代码实现:

伪代码:

quickSort(A, p, r)

    if p < r 

        q = partition(A, p, r)

        quickSort(A, p, q - 1)

        quickSort(A, q + 1, r)

在这里呢,为了排序一个数组的全部元素,初始调用的是A(A, 0, A.length)

其实在数组的分解中最终要的就是他的partition部分,这也是快速排序的关键所在

Go语言的实现:

package main

import "fmt"

func partition(A []int, p int, r int) int {
	x := A[r-1]
	i := p - 1
	for j := p; j < r-1; j++ {
		if A[j] <= x {
			i += 1
			A[i], A[j] = A[j], A[i]
		}
	}

	A[i+1], A[r-1] = A[r-1], A[i+1]
	return i + 1
}

func quickSort(A []int, p int, r int) {
	if p < r {
		q := partition(A, p, r)
		fmt.Println(q)
		quickSort(A, p, q-1)
		quickSort(A, q+1, r)
	}

}
func main() {
	arr := []int{2, 8, 7, 1, 3, 5, 6, 4}
	quickSort(arr, 0, len(arr))

	for _, v := range arr {
		fmt.Println(v)
	}
}

快速排序的性能

在快速排序中,它的运行时间取决于他是否是划分平衡的,如果划分的平衡那么他的时间复杂度和归并排序一样是nlog2(n),当划分不平衡时,时间复杂度就和插入排序一样是O(n^2),但是当元素的个数大于20,快速排序的性能远远好于归并和堆排序(在划分平衡的情况下),这里也就是说他的平均性能是十分的优越的

1.最坏的情况:

当数组A[p,,r]在划分时产生了这么两个数组,他们的元素个数分别是A.length - 1和0,可想而知,当算法每一次递归调用时,都出现了这样极为不平衡的情况,那么划分的时间复杂度就是Θ(n),由于对于一个数组元素个数为0的数组的递归调用,就会直接返回,因此T(0) = Θ(1)

最终算法运行时间为:T(n) = T(n - 1) + Θ(n)

2.最好情况的划分:

其实在快速排序中一般或者绝大多数排序都是更加的接近于最好的情况,而不是最糟糕的情况,

在快速排序中,只要你划分的比例是常数比例,算法的时间复杂度总是O(nlogn),也就是说,哪怕你划分的结果是9999:1,时间复杂度还是O(nlogn);

说明:

本篇属于原创,允许转载,但是请标明原始的连接!!

参考:《算法导论》

快速排序的学习(基于Go),布布扣,bubuko.com

时间: 2024-08-25 18:40:30

快速排序的学习(基于Go)的相关文章

学习基于OpenGL的CAD程序的开发计划(一)

本人目前从事的工作面对的客户中很多来自高端制造业,他们对CAD/CAE/CAM软件的应用比较多.公司现有的软件产品主要是用于渲染展示及交互,但面对诸如CAD方面的应用(比如基于约束的装配.制造工艺的流程演示等),功能比较薄弱.本人计划在工作之余开始研究一下基于OpenGL的CAD程序开发的基础功能实现.由于目前工作直接使用的商业游戏引擎进行开发,对底层的OpenGL还不是特别熟悉,从产品发展的长远来看,结合CAD的功能应该是大势所趋,而目前利用一些三维CAD二次开发来实现虽然可以临时解决一些功能

关于lambda表达式的一些学习——基于谓词筛选值序列

今天看了一些关于lambda表达式的知识,然后对于Func<T,TResult>泛型委托不太熟悉,便查了查相关资料,又引出来了基于谓词筛选值序列这个对我来说的新鲜知识点,于是去查MSDN,以下是看到的一些相关介绍: 此方法通过使用延迟执行实现. 即时返回值为一个对象,该对象存储执行操作所需的所有信息. 只有通过直接调用对象的 GetEnumerator 方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的

Netty学习——基于netty实现简单的客户端聊天小程序

Netty学习——基于netty实现简单的客户端聊天小程序 效果图,聊天程序展示 (TCP编程实现) 后端代码: package com.dawa.netty.chatexample; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEven

yate学习--基于CentOS安装运行yate

基于CentOS安装Yate 1前言 思前想后,很多东西现在理解了,会用了.时间长了,对这个系统进行bug修复的时候.很多知道的东西会忘的差不多,需要重新花比较多的时间去理解和学习.俗话说:好记性不如烂笔头.还是老老实实的用文字和图片的方法来记录. 为了让以后的自己轻松一点,只要让现在的自己多做一点工作,重新开始搭建yate的环境. 2源码下载 最好从官网下载, 官网地址:http://www.yate.ro/ 下载地址:http://docs.yate.ro/wiki/Download 由于没

学习参考+《深度学习基于Keras的Python实践》PDF+ 源代码+魏贞原

深度学习学习框架有tensorflow.pytorch.keras.学习keras时,推荐<深度学习:基于Keras的Python实践>,适合深度学习入门和实践. 尤其是第三部分,利用卷积神经网络解决情感分析问题比较好. <深度学习:基于Keras的Python实践>系统讲解了深度学习的基本知识,以及使用深度学习解决实际问题,详细介绍了如何构建及优化模型,并针对不同的问题给出不同的解决方案,通过不同的例子展示了在具体项目中的应用和实践经验. 推荐参考:<深度学习:基于Kera

实践:《21个项目玩转深度学习基于TensorFlow的实践详解》PDF+源代码

学习<21个项目玩转深度学习>可以在自己动手实践的过程中找到学习的乐趣,了解算法和编程框架的细节,让学习深度学习算法和TensorFlow 的过程变得轻松和高效. 不是给想学深度学习的初学者看的,没有详细的讲解,只有项目操作的指示.但对于没有任何深度学习基础,又要尽快做出视觉分类demo的人来说是一本好书,能帮助快速上手. 学习实践: <21个项目玩转深度学习:基于TensorFlow的实践详解>PDF,378页,带书签目录,文字可以复制.配套源代码. 网盘下载:http://10

《从机器学习到深度学习基于scikit-learn与TensorFlow的高效开发实战》PDF代码分析

用通俗的语言讲解涵盖算法模型的机器学习,主要内容包括机器学习通用概念.三个基本科学计算工具.有监督学习.聚类模型.降维模型.隐马尔可夫模型.贝叶斯网络.自然语言处理.深度学习.强化学习.模型迁移等.在深入浅出地解析模型与算法之后,介绍使用Python相关工具进行开发的方法.解析经典案例,能理解.能设计.能编码.能调试,没有基础的在学习后也能够上手设计与开发机器学习产品. 推荐学习<从机器学习到深度学习:基于scikit-learn与TensorFlow的高效开发实战>,场景式机器学习实践,理论

&lt;强化学习&gt;基于采样迭代优化agent

前面介绍了三种采样求均值的算法 ——MC ——TD ——TD(lamda) 下面我们基于这几种方法来 迭代优化agent 传统的强化学习算法 || ν ν 已经知道完整MDP——使用价值函数V(s) 没有给出完整MDP——使用价值函数Q(s,a) 可见我们的目标就是确定下来最优策略和最优价值函数 | |——有完整MDP &&  用DP解决复杂度较低 |     ====>  使用贝尔曼方程和贝尔曼最优方程求解 |——没有完整MDP(ENV未知) or 知道MDP但是硬解MDP问题复杂

冒泡排序,插入排序,归并排序,快速排序的学习笔记

这几个很基础的排序非常有用,我重新整理了下代码 1 #include<iostream> 2 #include<algorithm> 3 4 using namespace std; 5 6 void Bouble_Sort(int * Arry,int Lenth) //冒泡排序 7 { 8 int i,k; 9 10 int flag = 0; 11 12 for(i = Lenth - 1;i >= 0; i--) 13 { 14 for(k=0;k<i;k++)