打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
由快速排序到分治思想



   快速排序是一种基于分治思想的排序算法 它主要分为以下几步

1、一个数组按切分元素分成两个数组,一个数组是大于切分元素的,另一个数组是小于切分元素的,

2、然后将这两个部分按上面的思路独立排序。

3、并将有序的子数组归并 得到一个完整的数组。

这中间的关键就在于切分。

           

代码实现

public class Quick {

       private static void sort(Comparable[] a, int l0, int l1) {

              // TODO Auto-generated method stub

              if(l0 > l1) return;   //做基本的判断

              int l2=partition(a,l0,l1);  //调用方法实现按切分 得到最终a所在位置

              sort(a,l0,l2-1);   //排序比a小的数组

              sort(a,l2 1,l1);   //排序比a大的数组

       }

       private static int partition(Comparable[] a, int l0, int l1) {  //定义切分方法

              int i=l0;   int j=l1 1; //定义左右指针

              Comparable  v=a[0];  //获得切分元素

              while(true){   扫描左右

                     while(less(a[ i],v))  if(i==l1)  break;

//调用 less方法做判断a[i] 和v 直到a[i]大于v时 或者 i 到数组末尾时才停止

                     while(less(v,a[j--])) if(j==l0)  break;

//调用 less方法做判断a[j] 和v 直到a[j]小于v时 或者 i 到数组头时才停止

                     if(i>j)  break;   //做判断  如果作为切分调出循环

                     exch(a,i,j);   调用exch()方法来吧a[i]和a[j] 交换位置

              }

              exch(a,l0,j);   //调用exch()方法 将v放入正确的位置

              return j;

       }

}


快速排序的特性

复杂度 NlgN 空间复杂度 lgN 其运行效率与切分元素值有关  一把在排序之前先随机整个数组。 快速排序也是最快的通用排序算法。


分治思想理念                       

分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题。所以他有三个要点

1、划分步:把输入的问题划分为k个子问题,并尽量使这k个子问题的规模大致相同

2、治理步:调用处理方法来处理问题。

3、组合步:组合步把各个子问题的解组合起来。


从快速排序到分治

在快速排序中将一个数组按切分元素分成两个数组就是在不同的划分步。然后将这两个部分按上面的思路独立排序  这就是治理步。 最后将所有的子数组归并到一个数组 就是组合步。


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
算法—5.快速排序
优先队列实现原理分析
六种常见排序算法分析与实现
数据结构与算法(七)堆
大学c语言期末复习重点( 有点多)
数据结构面试题总结6-----数组:求两个数组中满足给定和的两个元素
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服