数据结构和算法-快速排序法|学习笔记

简介: 快速学习数据结构和算法-快速排序法

开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-快速排序法】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/627/detail/9852


数据结构和算法-快速排序法


快速排序法介绍:

快速排序(Quicksort)是对冒泡排序的一种改进。

基本思想是:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序法示意图:

image.png

这个图是以最后一个为基准,但并不是每一个都是以最后一个为基准,这个案例是以中间数为中轴,以它为支点进行分割的,如果以11为基准,是从小到大排,它先把比11小的数放在一边,

但是它并不是有序的,它只能把比11小的放在一边,然后比11大的放在11的另一边,因为它是从小到大排,接下来还要分,

它又把11左边的的数,以最后一个数为基准,然后比5小的放在一边,比5大的放在另一边,然后再把右边的分割,

再以最后的数为基准,比8大的分在一边,比8小的分在另一边,因为8左边没有了,所以就不分了,这样2 5 8 10就出来了,同样的方法,11右边的数也是无序的,也像刚才那样分开即可。

所以整个过程就是一个递归的过程,这个理解起来就比选择和插入排序要困难很多了。因为这里用到了很多递归。

应用实例:

要求:对[-9,78,0,23,-567,70]进行从小到大的

排序,要求使用快速排序法。

【测试8 w 和800 w】

说明[验证分析]:

t)如果取消左右遂归,结果是-9 -567 0 23 78 70

2)如果取消右递归,结果是-567 -9 0 23 78 70

3)如果取消左递归,结果是-9 -567 0 23 70 78

代码实现:

package main

import

"fmt"

)

//快速排序

//说明

//1.left 代表数组左边的下标

2.right 表示数组右边的下标

3.array 表示要排序的数组

image.png

func quick Sort(left int, right int, array*[6]int){

1:=left

r:=right

//pivot 是一个中轴,也叫支点

pivot:=array[(left+right)/2]把中间的数当做支点

temp s=0

//for 循环的目标是将比 pivo t小的数放到左边

//把 pivot 大的数放在右边

for;1<r;{

//先从 pivot 的左边找到大于等于 pivot 的值

要不停的找

for;array[1]<pivot;{

L++

)

//再从 pivot 的右边找到小于等于 pivot 的值

for;array[r]>pivot;{

)

// l>=r表明分解任务完成,针对这一次的

if l>=r{

break

}

//交换,其实就是78和-567交换,位置互换

temp=array[l]

array[l]=array[r]

array[r]=temp

//优化

if array[l]==pivot{

r--

}

if array[r]==pivot{

L++

//如果 l==r,再移动一位

if l==r{

L++

R--

//向左递归

If left<r{

quicksort(left,r, array)

}

//向右递归

if right >1{

quicksort(1, right, array)

}

}

func main(){

arr;=[6]int{-9,78,0,23,-567,70}

//调用快速排序

Quicksort(0,len(arr)-1,&arr)

Fmt.println(“main...”)

Fmt.println(arr)

}

现在要理解成两个指针,一个左边的指针,一个右边的指针,现在它先找到中间的那个值,也就是现在 pivot 就是0,就相当于找到那个值78,找到78的目标就是再找到右边一个比78小的数交换,两者交换。

显然还有一个指针,要找到小于0的就是-567,找不到就一直找,一直找不到说明已经达到目的了,就不用再找了,整个for循环结束之后,左右就都找到了,把下边的都注销后就会发现是正确的,接下来调用快速排序。

效果和我们分析的是一样的,所以它在0的左边也不是从小到大的,在0的右边也不是从小到大的,所以我们注销的代码是必不可少的。它就能保证0左边和右边的递归是正确的。

如果代码没有变化,0左边还是没有递归的,也不是从小到大排的。处理过后就保证了0左右两边都是有序的。

现在把数据量扩大一点,结果还是正确的。

func quick Sort(left int, right int, array*[9]int){

1:=left

r:=right

//pivot 是一个中轴,也叫支点

pivot:=array[(left+right)/2]把中间的数当做支点

temp s=0

//for 循环的目标是将比 pivot 小的数放到左边

//把 pivot 大的数放在右边

for;1<r;{

//先从 pivot 的左边找到大于等于 pivot 的值

要不停的找

for;array[1]<pivot;{

L++

)

//再从 pivot 的右边找到小于等于 pivot 的值

for;array[r]>pivot;{

)

// l>=r表明分解任务完成,针对这一次的

if l>=r{

break

}

//交换,其实就是78和-567交换,位置互换

temp=array[l]

array[l]=array[r]

array[r]=temp

//优化

if array[l]==pivot{

r--

}

if array[r]==pivot{

L++

//如果 l==r,再移动一位

if l==r{

L++

S--

//向左递归

If left<r{

quicksort(left,r, array)

}

//向右递归

if right >1{

quicksort(1, right, array)

}

}

func main(){

arr;=[9]int{-9,78,0,23,-567,70,123,90,-23}

//调用快速排序

Quicksort(0,len(arr)-1,&arr)

Fmt.println(“main...”)

Fmt.println(arr)

}

增加之后会发现是正确的,是从小到大排的。

相关文章
|
16天前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
27 1
|
19天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
63 4
|
1月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
53 4
|
17天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
114 61
|
17天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
17天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
25天前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
86 23
|
25天前
|
算法
数据结构之蜜蜂算法
蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
57 20
|
16天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
42 1
|
25天前
|
机器学习/深度学习 算法 C++
数据结构之鲸鱼算法
鲸鱼算法(Whale Optimization Algorithm,WOA)是由伊朗研究员Seyedali Mirjalili于2016年提出的一种基于群体智能的全局优化算法,灵感源自鲸鱼捕食时的群体协作行为。该算法通过模拟鲸鱼的围捕猎物和喷出气泡网的行为,结合全局搜索和局部搜索策略,有效解决了复杂问题的优化需求。其应用广泛,涵盖函数优化、机器学习、图像处理等领域。鲸鱼算法以其简单直观的特点,成为初学者友好型的优化工具,但同时也存在参数敏感、可能陷入局部最优等问题。提供的C++代码示例展示了算法的基本实现和运行过程。
44 0

热门文章

最新文章