热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

快速排序和分治排序介绍

这篇文章主要介绍了快速排序和分治排序,需要的朋友可以参考下

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

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

//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;i0){
      this.n=n;
      test = new int[n];
      
      for(int i=0;in-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

代码运行如下:

95   40   64   18   78   23   73   84   40   


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

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


推荐阅读
  • 如何为PDF文档添加水印?简单步骤实现
    为了增强PDF文档的安全性和版权保护,添加水印是一个有效的方法。本文将介绍如何通过专业软件或在线工具轻松为PDF文档添加水印,确保您的文档在共享时仍能保持其独特性和安全性。 ... [详细]
  • 本文汇集了作者在准备研究生入学考试过程中的心得体会,包括备考策略、复习重点及应对考试的心理调适技巧,旨在为即将参加考研的学生提供实用建议。 ... [详细]
  • Web开发实践:创建连连看小游戏
    本文详细介绍了如何在Web环境中开发一款连连看小游戏,适合初学者和技术爱好者参考。通过本文,您将了解游戏的基本结构、连线算法以及实现方法。 ... [详细]
  • 本文介绍了如何通过 ADB 命令行工具启动和停止 Android 应用。通过简单的命令,您可以轻松地控制设备上的应用运行状态。 ... [详细]
  • 本文介绍了如何使用jQuery获取浏览器窗口的可视区域高度、文档的整体高度以及宽度等关键尺寸信息,包括边界、填充和边距在内的完整尺寸。 ... [详细]
  • SPFA算法详解与应用
    当图中包含负权边时,传统的最短路径算法如Dijkstra不再适用,而Bellman-Ford算法虽然能解决问题,但其时间复杂度过高。SPFA算法作为一种改进的Bellman-Ford算法,能够在多数情况下提供更高效的解决方案。本文将详细介绍SPFA算法的原理、实现步骤及其应用场景。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 探索CNN的可视化技术
    神经网络的可视化在理论学习与实践应用中扮演着至关重要的角色。本文深入探讨了三种有效的CNN(卷积神经网络)可视化方法,旨在帮助读者更好地理解和优化模型。 ... [详细]
  • 我整理了HMOV四大5G旗舰的参数,可依然没能拯救我的选择困难症
    伊瓢茕茕发自凹非寺量子位报道|公众号QbitAI报道了那么多发布会,依然无法选出要换的第一部5G手机。这不,随着华为P40系列发布,目前国 ... [详细]
  • 最优化算法与matlab应用3:最速下降法
    最优化算法与matlab应用3:最速下降法最速下降法是一种沿着N维目标函数的负梯度方向搜索最小值的方法。(1)算法原理函数的负梯度表示如下:搜索步长可调整ak,通常记为(第k次迭代 ... [详细]
  • Java高级工程师学习路径及面试准备指南
    本文基于一位朋友的PDF面试经验整理,涵盖了Java高级工程师所需掌握的核心知识点,包括数据结构与算法、计算机网络、数据库、操作系统等多个方面,并提供了详细的参考资料和学习建议。 ... [详细]
  • 本文探讨了在 Python 2.7 环境下,如何有效地对大量数据(如几百 KB 的字符串)进行加密和压缩,并确保能够准确无误地解密回原始数据。 ... [详细]
  • ACM经典书籍推荐
    本文介绍了几本在算法和计算机科学领域具有重要影响力的书籍,包括由Donald E. Knuth编著的《计算机程序设计艺术》第一卷,以及潘氏兄弟的数论经典教材等。这些书籍不仅是学习相关领域的宝贵资源,也是专业人士不可或缺的参考书。 ... [详细]
  • Linux内核中的内存反碎片技术解析
    本文深入探讨了Linux内核中实现的内存反碎片技术,包括其历史发展、关键概念如虚拟可移动区域以及具体的内存碎片整理策略。旨在为开发者提供全面的技术理解。 ... [详细]
  • 通过两幅详细的思维导图,全面解析Spring框架中应用的设计模式及其核心编程理念。 ... [详细]
author-avatar
香水百合-2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有