数据结构与算法|快速排序整理part1
选题想写了挺多,但最近要期末考试了QAQ,数据结构慌得一批,在不整理就die了。结合本周的实验课,挑选了一个排序看了看《大话数据结构这本书》进行简单整理一部分。ヾ(◍°∇°◍)ノ゙也算是第一次技术性的文档,第一次废话多了一点hhh,慢慢改进⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
参考书:《大话数据结构》 程杰著
1.啥叫快速排序?
1.1 快速排序背景
我们的数据结构老师曾说过,这一章其他排序可以懵逼,但是这个快速排序必须得会!为啥呢?因为“快”哈哈哈哈哈,主要还是原理简单应用广。曾被列为“20世纪十大算法之一”
相对于其他排序:
①希尔排序————直接插入排序pro
②简单选择排序————选择排序pro
快速排序————冒泡排序pro(交换排序)
1.2 快速排序核心
核心的点在于两个词比较和交换来实现排序,快速排序主要增加了比较和交换的距离,类似于直接快到位了,而不是轮番移动,从而达到减少次数的功能。
2.快速排序的具体原理
2.1基本思想
基本思想主要为:通过一趟排序将待排的记录分割为独立的两部分,其中的一部分记录的关键字均比另外一部分记录的关键字小,可分别两部分继续进行排序,已达到整个序列有序的目的。
2.2代码实现
/*对顺序表L快速排序*/
void QuickSort(SqList *L){
QSort(L,1,L->length)
}
/*对顺序L中的子序列L->r[low..high]作快速排序*/
void QSort(SqList *L,int low,int high){
int pivot;
if(low<high){
pivot=Partition(L,low,high); //L->r[low..high]分成两部分
QSort(L,low,pivot-1); //高的部分递归排序
QSort(L,pivot+1,high); //低的递归排序
}
}
/*交换顺序表L中字标的记录,使pivot的记录到位,返回其所在的位置*/
/*pivot前不大于它,后不小于它*/
int Partition(SqList *L,int low,int high){
int pivotkey;
pivotkey=L->r[low]; //第一个是轴
while(low<high){
while(low<high&&L->r[high]>=pivotkey)
high--;
swap(L,low,high); //记录小的再低
while(low<high&&L->r[low]<=pivotkey)
low++;
swap(L,low,high) //记录大的在高
}
return low; //返回枢纽在的位置
}
3.快速排序复杂度分析
在最优的情况下,快速排序的算法的时间复杂度是O(nlogn);
最坏,为O(n^2).
本文介绍了快速排序的基本思想和核心操作,它是通过一趟排序将数据分为两部分,并递归地对每一部分进行排序,达到整体有序。代码示例展示了快速排序的实现过程,包括Partition函数的使用。此外,还提到了快速排序在最优和最坏情况下的时间复杂度分别为O(nlogn)和O(n^2)。
1万+

被折叠的 条评论
为什么被折叠?



