美文网首页
数据结构与算法(四,分治法和快排)

数据结构与算法(四,分治法和快排)

作者: 腊鸡程序员 | 来源:发表于2019-01-30 11:25 被阅读14次

分治法

  • 思想:
    分治法的前提条件是数列已经是有序的,当在有序数列中查找一个数的位置时,首先取数列中间位置的值,与要查找的值比较,若arr[mid]>key,则low = mid+1,否则height = mid-1,然后继续取新的mid,直到height-low<=0(说明数列中没有key值,此时返回-(low+1)或者-1),或者arr[mid]=key(说明已找到key值,位置为mid)
  • 注意:
    在取mid值时,要注意闭包思想,也就是在数学中的左闭又开,这样才能形成一个完整的数列
    即:mid=(low+(height-1))/2
  • 代码
public int binarySearch(int[] array,int key,int fromIndex,int toIndex){
        if (fromIndex<0||toIndex>array.length-1){
            return -1;
        }else {
            int low = fromIndex;
            int height = toIndex-1;
            while(low<=height){
                int mid = (low+height)/2;
                if (array[mid]>key){
                    height = mid-1;
                }else if (array[mid]<key){
                    low = mid+1;
                }else {
                    return mid;
                }
            }
            return -(low+1);
        }
    }

快排

  • 思想:
    在数列中选取一个数,将数列中的数与之比较大小,大的放右边,小的放左边,这样一轮比较下来,该数的左边全部比他小,右边全部比他大.然后再取该数为新的low和height的位置,即(起点0)low--height(该数的位置) (该数的位置)low---height(终点arr[lenght-1])继续上述步骤,直到low>=height,此时,这个数列就是有序的
  • 步骤:
    1.取数列第0位作为目标值x
    2.取数列第0位和数列最后一位为low和height,
    3.从height开始依次往前比较,若arr[height]>x,height--,若arr[height]<x.
    arr[low] = arr[height],low++,然后开始4
    4.从low开始依次往后比较,若arr[low]<x,low++,若arr[low]>x,arr[height] = arr[low],height--,然后开始3
    5.当low=height时.x的位置已确定,x左边小于x,右边大于x,此时,第一轮比较完毕,将x值赋值给arr[low],arr[low] = x
    6.分别与x的位置为height和low,继续执行该算法,直到low>=height
  • 时间复杂度
    n为数组长度
    则每次最多比较n次
    比较log2n轮
    即O[n] = n*log2n
  • 代码
 public void quickSort(int[] array,int begain,int end){

        if (end-begain<=0){
            return;
        }

        int low = begain;
        int height = end;
        int x = array[begain];
        boolean direction = true;
        L1:
        while (low<height){
            if (direction){
                for (int i = height; i > low; i--) {
                    if (array[i]<x){
                        array[low++] = array[i];
                        height = i;
                        direction = !direction;
                        continue L1;
                    }
                }
                height = low;
            }else {
                for (int i = low; i <height; i++) {
                    if (array[i]>x){
                        array[height--] = array[i];
                        low = i;
                        direction = !direction;
                        continue L1;
                    }
                }
                low = height;
            }
        }

        array[low] = x;
        quickSort(array,begain,low-1);
        quickSort(array,low+1,end);
    }

相关文章

  • 数据结构与算法(四,分治法和快排)

    分治法 思想:分治法的前提条件是数列已经是有序的,当在有序数列中查找一个数的位置时,首先取数列中间位置的值,与要查...

  • 算法——快速排序

    有人甚至将快排称为分治法,但分治更多应该指明是一种思想,而非具体的排序算法。对于快速排序的内容,我这样概括:每趟排...

  • all

    算法与数据结构 常见算法类型 排序算法(冒泡、插入、选择、快排、希尔、堆排、归并、桶排、基数、计数)、字符串操作、...

  • 快排

    快排是一种很优雅的排序算法。 思想 快排基于分治,分治即分而治之,强调的是将复杂问题通过分解,变为多个简单子问题,...

  • 算法笔记:快排算法与归并排序

    快排算法与归并算法时间复杂度都是O(nlogn)的排序算法。适合大规模的数据排序。思想利用的是分治思想。 归并排序...

  • 快速排序法及优化

    快速排序 快排是目前平均时间复杂度最小的排序法。体现了分治的思想。算法比较经典,因此在这里记录一下,加深印象。 快...

  • 高级算法设计与分析

    目录 算法基础 算法复杂性 递归与分治 回溯法与分支限界法 贪心算法 动态规划法 NP问题 概率算法 现代优化算法...

  • Python初体验-快排

    快排是分治法 复杂度O(nlogn) 关键点为划分数组

  • 排序一、快速排序

    一、快排 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists) 算法流程: 从数列中挑出一个...

  • 快排算法

    转:微信公众号:程序员小灰 快排算法 是按分治算法的思路进行排序的。 选定参照元素后,每次比较都按分治算法将小的移...

网友评论

      本文标题:数据结构与算法(四,分治法和快排)

      本文链接:https://www.haomeiwen.com/subject/wjsqsqtx.html