【数据结构与算法】快排

来源:互联网 发布:卡密充值系统源码 编辑:程序博客网 时间:2024/05/16 15:22

快速排序是排序中速度比较优异的一种算法

核心函数是一个递归的划分算法partition函数,参数为list,low和high,执行一次函数的运行情况:

(1)因为是递归函数,那么在函数内部必须有一个if来检测递归的终止,条件就是low<high,然后才进入函数。如果low<high,那么说明此时的list中必然会有2个或者2个以上的元素,那么还是要进行排序的,否则,只有一个元素了,就直接return。

(2)设置两个指针l,h,指向low和high两个位置,同时选定key值为第一个元素的值(实际是选定哪个否可以,只是选定第一个的话函数的实现更加简单)。

(3)进入一个while循环,条件就是l<h,即还可以找到比key大或者小的元素。循环体内部,先从高位找,找到第一个比key小的元素,就让其与list[l]交换,然后再从地位找,找到第一个比key大的元素,让其与list[h]交换。这就完成了一次交换,再次进入while循环。

(4)跳出while以后,说明此时l==h,左边都是比key小的,右边都是比key大的,而且最后一次移位剩下的空位肯定是l或者h的一个,但是此时l==h,所以直接让list[l]=key即可。至此,一趟移位完成了。之后就是在k左边和右边的list递归即可。

代码:

import java.util.ArrayList;import java.util.List;public class QS {public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(-1);list.add(5);list.add(2);list.add(8);list.add(7);new QS().QSort(list);for(int i:list){System.out.println(i);}}private void partition(int low,int high,List<Integer> list){      if (low<high) {      int l = low;      int h = high;      int key = list.get(low);         while(l<h){        while(l<h&&key<=list.get(h)) h--;        list.set(l, list.get(h));        while(l<h&&key>=list.get(l)) l++;        list.set(h, list.get(l));         }         list.set(l, key);         partition(0, l-1, list);         partition(l+1, high, list);           }}public void QSort(List<Integer> list){partition(0, list.size()-1, list);}}


0 0