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

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

     快速排序让我看了很久,也折磨了我很长时间,因为大体上的思路我是有了,但是写代码时总是出现各种问题,要想把它调试出来对我个人来说还是有一定难度的,而且因为工作和偷懒的原因,导致之前调试不出来的错误放了很久,今天终于出来啦,还是有些小激动的哦,下面来分享一下我的代码并做一点点说明。

  要学会快速排序,就必须先要学会分治法,分治的思想是给一串乱序的数字(数字是假设,也可以是其他的对象,当然方法的参数可以自己定义哦,我在这里假设有一个整型的数组吧)然后给他一个中间数,分治法会把这些数字以给他的那个是中间数为分界分为两部分,一部分在中间数的左边,另一部分在右边,以这个数为分界点,两边的数现在还是乱序的,我给他定义的方法如下:

//left是数组的想分治部分的左端点,right是数组分治部分的总端点,如长度为10的数组,我想对前5个整数进行分治,则传0,4即可    public int signalFenZhi(int left,int right){        if(left<0||left>n-1||right<0||right>n-1){            return -1;        }        int temp = test[left];        int j=right;        int i=left;                while(i
=test[left]&&i

当然,也可以把那个中间数当参数传进来,现在我只是单纯的以数组的传进来的第left数做为分界数,这只是为了说明。

  明白了分治,那么快速排序也就简单了,那就是对已经分为两部分的数再进行分治,依次类推,直到全部的数字都有序为止,代码如下:

public void quickSort(int left,int right){        if(right-left<1){            return ;        }else{            int point = this.signalFenZhi(left, right);            System.out.println(point);            //if(point!=left&&point!=right){
quickSort(left,point-1); quickSort(point+1,right); //} } }

  快速排序的效率在众多的排序算法中是很优秀的,时间复杂度为O(N*log2n),但是如果分治的分界点选的不好的话,时间复杂度将会降到(n的平方),因为如果正好这个数组是有序的,然后我们每次都取传过来的最左端的数,那么效率就会很低,所以要避免发生这种情况,如果检测所有的选项,那么将会很花时间,所以一个折中的办法 ,就是把最左端的数和最右端的数加上一个中间的数,找到他们三个中间的数,以这个为分界值就会变的好一点,在上面方法的基础上,修改以后的代码如下,但是我做完了以后这样的做法不是很好,应该把分界值也当做传给分治的方法会好些,细心的朋友可以自己试一下,我在这里就不试了哈,大体上是一样的哦!

package com.jll;public class FenZhi {        int[] test;        int n=10;        public FenZhi(){        test = new int[10];                for(int i=0;i
0){ this.n=n; test = new int[n]; for(int i=0;i
n-1||right<0||right>n-1||left>=right){ return -1; } if(right-left>=2){ int middle = (right+left)/2; if(test[left]>test[middle]){ int temp = test[middle]; test[middle] = test[left]; test[left] = temp; } if(test[left]>test[right]){ int temp = test[left]; test[left] = test[right]; test[right] = temp; } if(test[middle]>test[right]){ int temp = test[middle]; test[middle] = test[right]; test[right] = temp; } int temp = test[middle]; test[middle] = test[left]; test[left] = temp; int j=right-1; int i=left+1; while(i
=test[left]&&i

代码运行如下:

17     95     40     64     18     78     23     73     84     40     1the point is:4the point is:1the point is:3the point is:7the point is:6the point is:917 18 23 40 40 64 73 78 84 95

以上就是我学习到的东西,记录一下,以备后面查阅

转载于:https://www.cnblogs.com/lilyjia/p/4381790.html

你可能感兴趣的文章
Tcpdump
查看>>
Android TabHost中使用startActivityForResult无法接收返回值的解决方案
查看>>
做一些面试题目(JavaScript部分)
查看>>
Azure Site Recovery 通过一键式流程将虚拟机故障转移至 Azure虚拟机
查看>>
Hello China操作系统STM32移植指南(一)
查看>>
cocos2dx CCEditBox
查看>>
VC++2012编程演练数据结构《8》回溯法解决迷宫问题
查看>>
第一阶段冲刺06
查看>>
WIN下修改host文件并立即生效
查看>>
十个免费的 Web 压力测试工具
查看>>
工作之:javascript——js string 转 int 注意的问题——parseInt
查看>>
ckeditor 粘贴后去除html标签
查看>>
C++二维数组new小结(zz)
查看>>
ICPC World Finals 2019 题解
查看>>
mysql查看表结构命令
查看>>
C++之内核对象进行线程同步
查看>>
Java中==规则
查看>>
枚举类型与递归
查看>>
SQL中sysname数据类型的含义(转)
查看>>
UVA10462Is There A Second Way Left? —— 次小生成树 kruskal算法
查看>>