算法篇一(分治思想下的快速排序)

分治思想下的快速排序

分治思想

 1.分治法的设计思想:把一个难以解决的大问题,分割成几个规模较小的相同问题,然后处理这些小问题,最终解决这个大问题。
 2.分治策略:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。
 3.如果原问题可以分割成k个子问题(1<k<=n),而且这些小问题都可解,并且可以根据这些小问题的解求出原问题的解,那么就可以使用分治法,由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。
 4.分治适用的情况:
  1.该问题的规模缩小到一定的程度就可以容易地解决
  2.该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
  3.利用该问题分解出的子问题的解可以合并为该问题的解
  4.该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题

快速排序

 1.基本思想:
  1.先从数组中选取一个基准数,通常是a[0]
  2.对数组进行分区,比基准数大的放到右边,比基准数小的放到左边
  3.对两个分区再次进行1.2步的操作,重复下去,知道数组排序完成
 2.代码实现(java):

public static void main(String[] args) {
    int[] arr = {32,12,53,25,64,62,41,33,7};
    new demo2().quickSort(arr, 0, arr.length - 1);
    System.out.println(Arrays.toString(arr));

}

private void quickSort(int[] arr, int start, int end) {

    if(start>=end){
        return;
    }
    int k=arr[start];
    int i=start,j=end;
    while (i!=j){
        while(i<j&&arr[j]>=k) {
            --j;
        }
        swap(arr,i,j);
        while(i<j&&arr[i]<=k) {
            ++i;
        }
        swap(arr, i, j);
    }
    //分治思想
    quickSort(arr,start,i-1);
    quickSort(arr,i+1,end);
}

private void swap(int[] arr, int i, int j) {
    int temp;
    temp = arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
}

文章作者: Kobe-Liu1
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Kobe-Liu1 !
 上一篇
算法篇二(分治思想下的归并排序) 算法篇二(分治思想下的归并排序)
分治思想下的归并排序归并排序 1.归并思想:首先把一个数组中的元素,按照某一方法,先拆分了之后,按照一定的顺序各自排列,然后再归并到一起,使得归并后依然是有一定顺序的 。 2.归并排序算法可以利用递归的思想或者迭代的思想
2020-06-18 Kobe-Liu1
下一篇 
高数二(不定积分) 高数二(不定积分)
不定积分相关整理概念相关 1.F(x)的导数是f(x),那么就称F(x)是f(x)的原函数 需要明确:  连续函数一定有原函数  且原函数有无数个 ,及F(x)+C, C为常数 2.第一类换元积分法: &
2020-06-16 Kobe-Liu1
  目录