快速排序の单向扫描法

2019-01-31  本文已影响0人  掌灬纹

工程上的排序大多使用复杂度为O(nlgn)即快排的方式。

简介快排即为三部:

1.定主元位置划分(划分为两部分左边都比主元小,右边都大)

2.递归的解决两边的问题。同1

3.合并(快排因为划分的原因不在需要合并)

单向扫描法思路:

1.定主元pivot

2.扫描指针sp,尾指针bigger

3.<=pivot sp右移

  > pivot与bigger当前元素交换,bigger左移

  边界:sp > big 交错 跳出 将主原 与 bigger元素交换 最后返回bigger(主元位置)

(Java代码示例)

static void quickSort(int[] arr, int p, int r) {

if(p < r) {//递归出口

int q = partition(arr, p, r);//定主元位置

quickSort(arr, p, q-1);//左侧递归排序

quickSort(arr, q+1, r);//右侧递归排序

}

}

static int partition(int[] arr, int p, int r) {//单向扫描定主元位置

int pivot = arr[p];//数组的第一个元素为主元大小

int sp = p + 1;//扫描指针

int bigger = r;//右侧指针

while(sp <= bigger) {//两指针交错跳出循环

if(arr[sp] <= pivot) {//<=主元素,扫描指针右移

sp++;

}else{//>主元素,当前元素与右侧指针交换,右侧指针左移

swap(arr, sp, bigger);

bigger--;

}

}

swap(arr, p, bigger);//主元素放到合适的位置(bigger指针)

return bigger;//主元素位置 且数组左边都小于主元素 右边都大于主元素

}

static void swap(int[] arr, int i, int j) {//交换下标为 i j 的元素

int temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

上一篇下一篇

猜你喜欢

热点阅读