算法设计与分析——快速排序(分治法)

算法思想:

快速排序算法思想基于分治法思想之上,存在分解、解决这两步。

  • 分解:
    数组A[p…r]被划分为子数组A[p…q-1]和 A[q+1…r], A[p…q-1]中的每个元素都小于等于A[q],A[q+1…r]中的每个元素都大于等于A[q]
    q在划分时确定
  • 解决:
    通过递归调用快速排序算法,对子数组 A[q+1…r]和A[p…q-1]进行排序

算法伪码:

QUICKSORT(A,p,r)

if p<r then 
  q=PARTITIION(A,low,high) 
  QUICKSORT(A,low,p-1) 
  QUICKSORT(A,p+1,high)

Key subroutine: PARTITION(A, low, high)

java语言代码:

挖坑法实现 PARTITION(A, low, high) :找坑位,填坑
仅适用于可双向遍历的顺序序列,不适用于单向检索的链表

import java.util.Arrays;

public class Quick {

    /* pivot每次为数组初位置  
    public  static int partition(int a[],int low,int high) {
        int pivot=a[low];
        while (low<high){
            //初始头位置的数已经给pivot,从后往前找第一个小于pivot的位置,把小于pivot的数赋给给low位置
            while (low<high && a[high]>=pivot){
                high--;
            }
            a[low]=a[high];
            while (low<high && a[low]<=pivot){
                low++;
            }
            a[high]=a[low];
        }
        a[low]=pivot;
        return low;
    }
    
    public static void quicksort(int surArr[],int low,int high){
        int pivotloc;
        if(low<high){
            pivotloc=partition( surArr , low,  high);
            quicksort(surArr,low,pivotloc-1);
            quicksort(surArr,pivotloc+1,high );

        }

    }

    public static void main(String[]agrs){
        int arr[]=new int[]{8,2,4,9,3,6};
        System.out.println(Arrays.toString(arr));

        int len=arr.length;
        quicksort(arr,0,len-1);
        System.out.println(Arrays.toString(arr));

    }
}

前后指针法实现 PARTITION(A, low, high) :
在没找到大于pivot值前,i永远紧跟j;遇到大的两者之间机会拉开差距,中间差的肯定是连续的大于pivot的值;当再次遇到小于key的值时,交换两个下标对应的值就好了。
可适用于链表进行排序

import java.util.Arrays;

public class Quick {
public  static int partition(int a[],int low,int high) {

        int pivot=a[high];
        int i=low-1;
        int j=low;
        for(;j<high;j++){
            if(a[j]<=pivot){
                i++;
                exchange(a,i,j);
            }
        }
        i++;
        exchange(a,i,high);
        return i;
    }

    //交换数组中a,b位置上的数
    public static void exchange(int arr[],int a,int b){
        int temp;
        temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }

    public static void quicksort(int surArr[],int low,int high){
        int pivotloc;
        if(low<high){
            pivotloc=partition( surArr , low,  high);
            quicksort(surArr,low,pivotloc-1);
            quicksort(surArr,pivotloc+1,high );

        }

    }

    public static void main(String[]agrs){
        int arr[]=new int[]{8,2,4,9,3,6};
        System.out.println(Arrays.toString(arr));

        int len=arr.length;
        quicksort(arr,0,len-1);
        System.out.println(Arrays.toString(arr));

    }
}

猜你喜欢

转载自blog.csdn.net/karin_0/article/details/83245838