Partitionh算法

320 阅读2分钟

1.什么是Partition算法?

​ partition算法从字面上就非常好理解,就是分割算法!简单讲就是可以把数组按照一定的分成几个部分,其中最常见的就是快速排序中使用的partition算法,这是一个二分partition算法,将整个数组分解为小于某个数和大于某个数的两个部分,然后递归进行排序算法。

下面是一个组数(以第一个数作为基准,从后往前扫和从前往后.)

    public static int partition1(int[] array, int lo, int hi) {
        //以第一个值为基准值,当然你也可以3取1,
        int key = array[lo];
        while (lo < hi) {
            while (array[hi] > key && hi > lo) {//从后半部分向前扫描
                hi--;
            }
            array[lo] = array[hi];
            while (array[lo] <= key && hi > lo) {//从前半部分向后扫描
                lo++;
            }
            array[hi] = array[lo];
        }
        array[hi] = key;
        return hi;
    }

    public static void main(String[] args) {
        int[] a = {34, 2, 25, 1, 12, 34, 12, 56, 23, 15, 34, 67, 89, 54, 33};
        int i1 = partition1(a, 0, 14);
        System.out.println(i1);
    }

int[] a={34, 2, 25, 1, 12, 34, 12, 56, 23, 15, 34, 67, 89, 54, 33}
定义一个key=num[0]=341轮->
//从后半部分向前扫描
 array[14]=33<key;array[0]=33;lo=0,hi=14
33, 2, 25, 1, 12, 34, 12, 56, 23, 15, 34, 67, 89, 54, 33
//从前往后扫
  lo=0
  array[lo]=33<key;
	lo++=1
  array[lo]=2<key;
  lo++=2
  array[lo]=25<key;
  lo++=3
  array[lo]=1<key;
  lo++=4
  array[lo]=12<key;
  lo++=5
  array[lo]=34=key;
  lo++=6
  array[lo]=12<key;
 	lo++=7
  array[lo]=56>key
  array[hi]=56;
	lo=7;hi=14;
array[]a={33, 2, 25, 1, 12, 34, 12, 56, 23, 15, 34, 67, 89, 54, 56}

第二轮
 //从后往前
  lo=7;hi=14
  array[hi]=56>key
  hi--=13;
	arry[hi]=54>key;
	hi--=12
  array[hi]=89>key;
	hi--=11
  array[hi]=67>key;
	hi--=10
  array[hi]=34=key;
	array[lo]=array[hi]=34
	array[]a={33, 2, 25, 1, 12, 34, 12,34, 23, 15, 34, 67, 89, 54, 56}
	lo=7;hi=10
	array[7]=34=key;
	lo++=8
  array[8]=23<key;
	lo++=9
  array[lo]=15<key;
	lo++=10
  array[lo]=34=key
  lo=hi
  array[hi]=array[lo]=34;
 	array[hi] = key;
  return hi;