快速排序及c++实现
来源:互联网 发布:java string类源码分析 编辑:程序博客网 时间:2024/06/16 13:49
一个暑假的闲暇,玩的是舒服了,可是脑子里的各种算法却忘了,果然编程是个靠保持状态的活,昨天复习了便快排,拿出来写个博客加深个印象。
简介:快排是基于分治模式的,它的平均时间复杂度为O(nlgn),最坏复杂度是O(n*n)。
思想:快排的其基本思想是,数组中先随机找个主元(pivot element),而将比主元小的数全放在主元左边,比主元大的数放主元右边,然后再将这个数组根据主元拆分成左右两个数组,再根据上步骤进行排序拆分,直到所有拆分出的数组只有一个元素,即拆无可拆,也就是排序好了。
算法导论给出的伪代码是:
QUICKSORT(A,p,r) if p<r then q = PARTITION(A,p,r) QUICKSORT(A,p,q-1) QUICKSORT(A,q+1,r) PARTITION(A,p,r) x=A[r] i=p-1 for j = p to r-1 do if A[j]<=x then i=i+1 exchange A[i]=A[j] exchange A[i+1] A[r] return i+1
其中伪代码中的“=”其实是左箭头,因为打着麻烦就换成”=”。
函数QUICKSORT是递归式,PARTITION 是具体的排序过程。
这里就直接讲解PARTITION排序过程,其中主元它用的是数组最后一位,然后设置一个下标i=p-1即数组头的前一位,然后再遍历数组A[i],当遇到比主元小的,就让i右移并让i的元素与对比出的比主元小的元素置换,这样遍历完整个数组后,就是把所有比主元小的元素全部移到了i的后边,而比主元大的就在i的右边。
根据这个原理再实现到c++上:
static void QuickSort(int a[],int s,int e){
//s为start,数组头,e为end,数组尾
if(s<e){
int flag = a[e];//主元为数组最后一位
int i = s-1;
int j = s;
while(j<=e){
if(a[j]<=flag){
i++;
//置换
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
j++;
}
QuickSort(a,s,i-1);
QuickSort
a,i+1,e);
}
}
- 快速排序及C语言实现
- 单链表及快速排序c语言实现
- 快速排序及C语言实现
- 常用排序算法之快速排序c及lua实现
- 快速排序c实现
- 快速排序C实现
- 快速排序C实现
- 快速排序C实现
- 快速排序(C实现
- 快速排序算法思想及C语言实现
- 快速排序(分而治之策略及C语言实现)
- 快速排序及代码实现
- 快速排序算法及实现
- 快速排序思想及实现
- 快速排序及代码实现
- 快速排序及Java实现
- 快速排序及Java实现
- 快速排序及c++实现
- Guava Cache使用笔记
- git 如何正确的提交文件
- cf 849B
- 欢迎使用CSDN-markdown编辑器
- git 使用详细介绍
- 快速排序及c++实现
- 大话设计模式之一:如何在visual studio 中建立C#程序
- 绑定开发者-小程序开发设置2-微信小程序开发-视频教程9
- 应用环境下的TIME_WAIT和CLOSE_WAIT
- spring AOP
- shell之循环语句结构
- 懒惰(程序员)使人进步
- git
- Linux shell 命令学习:循环读取文件内容