博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高速排序--双边扫描与单边扫描的实现
阅读量:7072 次
发布时间:2019-06-28

本文共 1705 字,大约阅读时间需要 5 分钟。

高速排序 时间复杂读O(N*logN),最差O(N^2),平均O(N*logN)

主要思想是选取一个标志位,大于标志位的放到右边。小于标志位的放到左边。在以标志位为切割,分而制之,左递归,右递归。直到完毕。

高速排序的思想(双边扫描)

高速排序就像一个数据快,前后各有一个下标(指针)i/j,随机选取(此处取下标为0的)一个元素作为标志位。存储在暂时变量中(tmp),j从后向前移动(j--)直到碰到比tmp还要小的数时与i交换,此时i開始像后走,直到遇到第一个比tmp大的数,与j交换。

递归直至完毕。

高速排序思想(单边扫描)

从左到右扫一遍,类似于冒泡排序,仅仅是不停的把小于标志位的值放到左边,大于的放到右边。找到切割位置将标志位放入。

单边扫描怎么把小于标志位(下标end)的放左边。大于标志位的放右边,双边扫描是通过挖坑埋数的方式来实现的,单边扫描能够通过一个small 标志位记录连续最小的哪一个数,index一直向前走找到第一个不连续的小于标志位的值,与small++(第一个大于标志位的值)进行交换。直到循环结束,将small++的值放到标志位end的下标位置。

注:如有错误,望批评指正。算法主要是思想,其次就是依照思想去实现了。//双边int partition2(long *str,int start,int end,int length){	if(str == NULL || length <=1 || start >end)		return 0;	int i=start;	//标志位        long tmp = str[start];	int j=end;	while(i!=j){		while(i
tmp) j--; if(i
length) return; int i=start; int small = i-1; for(i;i
end) return; //int mid = quick(str,start,end,length); int mid = partition2(str,start,end,length); int i=0; for(i;i
完整代码

执行环境:ubuntu 14.04 kylin、gcc

#include 
#include
void swap(long *A,long *B){    long tmp;    tmp = *A;    *A = *B;    *B = tmp;}int partition2(long *str,int start,int end,int length){    if(str == NULL || length <=1 || start >end)        return 0;    int i=start;    long tmp = str[start];    int j=end;    while(i!=j){        while(i
tmp)            j--;        if(i
length)        return;    int i=start;    int small = i-1;    for(i;i
end)        return;        //int mid = quick(str,start,end,length);        int mid = partition2(str,start,end,length);     int i=0;    for(i;i
10000)        return 0 ;    srand((unsigned int)time(0));    int i=0;    for(i=0;i

转载地址:http://izkml.baihongyu.com/

你可能感兴趣的文章
玩转算法面试:(三)LeetCode数组类问题
查看>>
kali:加速WEP黑客攻击,ARP请求重播攻击
查看>>
C# 添加、获取及删除PDF附件
查看>>
华为S5300系列交换机V200R001SPH027升级补丁
查看>>
CISP-PTE注册信息安全专业人员渗透测试工程师知识体系大纲
查看>>
移动web开发中,好用的小方法
查看>>
Go 语言的垃圾回收演化历程:垃圾回收和运行时问题
查看>>
【Java资源免费分享,网盘自己拿】
查看>>
webpack配置(第四步:html篇(进阶篇))
查看>>
Spring Boot开启的2种方式
查看>>
阿里云服务提供商分享CDN访问异常该如何排查
查看>>
利用Sympy计算sin1°的最小多项式
查看>>
Vuejs响应式原理
查看>>
【Nebula系列】C++反射机制:可变参数模板实现C++反射
查看>>
mac 终端 常用命令
查看>>
2016年人工智能产业梳理:一朝引爆,稳步前进(下篇)
查看>>
django 1.8 官方文档翻译:5-1-2 表单API
查看>>
区块链将会怎样颠覆Google、Amazon、Facebook和Apple?
查看>>
VR直播很火,但能取代传统电视直播吗?
查看>>
[转]区块链代码快速学习实践
查看>>