当前位置: 首页 > news >正文

数据结构——快速排序

快速排序

算法思想:在待排序表L[1..n]中任取一个元素pivot作为枢轴(或基准,通常取首元素),通过一趟排序将待排序表划分为独立的两部分[[1...k-1]和L[k+1..n],使得L[1..K-1]中的所有元素小pivot,L[k+1..n]中的所有元素大于等于pivot,则pivot放在了其最终位置L(k)上,这个过程称为一次“划分”。然后分别递归地对两个子表重复上述过程,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上。

下面进行演示:

low和high指针作用:若low/high指向的元素大于/小于基准,进行右移/左移。

这里有一个数组A[8]= { 4,0,1,6,5,3,2,7 },我们设定两个指针low和high,指向数组两头,并取数组第一个元素4作为基准,此时4作为一个判断的根据。然后开始快速排序:

以4作为基准,现在对A[high]与4进行判断,此时7>4不用移动,high--,移动到这里:

此时A[high]=2<4,将A[high]的值赋给A[low]并让low指针开始操作,有几个low指向的元素都小于4,low一直移动到6那个位置:

此时A[low]大于4,将A[low]的值赋给A[high]:

这时到high指针进行移动:

此时A[high]=3<4,将A[high]的值赋给A[low]:

现在轮到low指针进行移动,low指针进行右移,此时A[low]=5>4

将A[low]的值赋给A[high]:

然后轮到high指针进行左移,此时low和high指针重合,将pivot=4变量赋值到A[low]的位置,并结束这一次排序。

以4作为分界线,分开左右两个子表,此时{2,0,1,3}与{5,6,7}进行上面的排序,排序完之后继续细分,最终结束排序。

下面是代码:

#include<stdio.h>
int Partition(int A[], int low, int high)
{int pivot = A[low];while (low < high){while (low < high && A[high] >= pivot)--high;A[low] =A[high];while (low < high && A[low] <= pivot)++low;A[high] = A[low];}A[low] = pivot;return low;
}
void QuickSort(int A[], int low, int high)
{if (low < high){int pivotpos = Partition(A, low, high);QuickSort(A, low, pivotpos - 1);QuickSort(A, pivotpos + 1, high);}
}
int main()
{int A[8] = { 4,0,1,6,5,3,2,7 };int n = 8;QuickSort(A, 0, 7);for (int i = 0; i < 8; i++){printf("%d ", A[i]);}return 0;
}

结果:

算法效率分析:

快速排序有点像树结构,结束总排序后进行左右两分支的排序,因此有许多与树相似的特性。

最好时间复杂度=O(nlog2n)

最坏时间复杂度=O(n^2)

最好空间复杂度=O(log2n)

最坏空间复杂度=O(n)


http://www.mrgr.cn/news/68106.html

相关文章:

  • 解锁炎症和肿瘤免疫治疗新靶点:TREM1&TREM2
  • display:none后没有过度动画,transition未生效
  • vit及其变体(swin Deit)
  • cuda 环境搭建
  • 计算机网络-以太网小结
  • 【实战篇】requests库 - 有道云翻译爬虫 【附:代理IP的使用】
  • 带你用Go实现二维码小游戏(下)
  • 一文了解git TAG
  • 基于Python+Vue开发的蛋糕商城管理系统
  • C++ 判断是不是平衡二叉树
  • 【fiddler】用fiddler实现手机抓包
  • 华为OD机试 - 学生排名(Java 2024 E卷 100分)
  • LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略
  • move_base
  • D365 无法在数据被选择或插入到另一个事务作用域中的缓冲区上调用 NEXT、update() 或 delete()
  • Visual Studio Code从安装到正常使用
  • 在鱼皮的模拟面试里面学习有感
  • 代码中的设计模式-策略模式
  • LLMs之RAG:《LightRAG: Simple and Fast Retrieval-Augmented Generation》翻译与解读
  • MDC(重要)
  • 06 网络编程基础
  • STM32Cube高效开发教程<高级篇><FreeRTOS>(十二)-----互斥量使用例程
  • YoloV10改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码
  • OpenResty 1.27.1.1 已经正式发布
  • 市场营销应该怎么学?
  • 人工智能将如何塑造下一代网络威胁