博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速排序
阅读量:5116 次
发布时间:2019-06-13

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

package sort;import java.util.Scanner;public class 快排 {    private  static void sort(int x,int y,int[] a){        int i,j,k,t,l;        i=x;        j=y;        k=a[(i+j)/2];        do{              while ( (i
k) ) { j—;} if (i
x) { sort(x,i-1,a); } if (j+1

    快排原理是分治思想,其中随机化快排最快。这段代码是错误的,是我一开始的代码,我改了很久,发现其中有几点值得关注。

    问题一:一个是a[I],a[j]与k的比较有没有等号的问题。

    问题二:离开do while循环时,I=j对应的值是否为k的问题。

    先说第一个,假设存在等号,那会出现什么情况,看这组数据--------

    10

    1 1 4 4 6 6 2 2 3 3

    当第一次执行时,k=6,然而执行完,I=j=9;直接出现问题二,也就是说,如果有等号,那么离开的时候,I=j对应的值就不一定是k,也就是说,你接下来的分治有问题。(分治是基于k已经定位好,且以k为中心进行划分)

    那么如何解决这个问题呢,大家踊跃留言吧...(我暂时没想到在保留等号下的快排算法)

    我们继续看,当没等号的时候,又会出现什么情况。

    先看这组数据:

    7

    1 4 3 4 1 4 8

    这组数据会导致死循环,问题出在哪里呢?还是相等问题,当k值在数列中多次出现,就可能出现这种情况。

    一开始我的解决方案是在a[I]a[j]交换后加I++,j—;

    但事实是,可能出现第一次所提到的问题二。

    总是有问题二出现,事实上,它也是这个算法成立的基础条件,既然你这么重要,那我给你加个标记,省的你乱跑找不到。于是我写了这个代码:

package sort;import java.util.Scanner;public class 快排 {    private  static void sort(int x,int y,int[] a){        int i,j,k,t,l;        i=x;        j=y;        l=(i+j)/2;        k=a[l];        do{              System.out.print(i+"  "+j+"  "+k+"------");             while ( (i
k) ) { j--;} System.out.println(i+" "+j+" "+k); if (i
x) { sort(x,l-1,a); } if (l+1

    这段代码基本解决了了刚才所提到的问题,暂时还没找到错误的数据,如果大家有更简洁的代码,记得分享一下。

转载于:https://www.cnblogs.com/ddzj/p/4365312.html

你可能感兴趣的文章
CF992E Nastya and King-Shamans(线段树二分+思维)
查看>>
第一个Java Web程序
查看>>
树状数组_一维
查看>>
如果没有按照正常的先装iis后装.net的顺序,可以使用此命令重新注册一下:
查看>>
linux install ftp server
查看>>
嵌入式软件设计第8次实验报告
查看>>
算法和数据结构(三)
查看>>
Ubuntu下的eclipse安装subclipse遇到没有javahl的问题...(2天解决了)
查看>>
alter database databasename set single_user with rollback IMMEDIATE 不成功问题
查看>>
Repeater + Resources 列表 [原创][分享]
查看>>
WCF揭秘——使用AJAX+WCF服务进行页面开发
查看>>
【题解】青蛙的约会
查看>>
IO流
查看>>
mybatis调用存储过程,获取返回的游标
查看>>
设计模式之装饰模式(结构型)
查看>>
面向对象的设计原则
查看>>
Swift3.0服务端开发(三) Mustache页面模板与日志记录
查看>>
【转】 FPGA设计的四种常用思想与技巧
查看>>
EntityFrameWork 实现实体类和DBContext分离在不同类库
查看>>
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>