=====相关链接====
对归并排序感兴趣的同学请点击奥格瑞玛传送门
对堆排序感兴趣的同学请点击达纳苏斯传送门
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
可能光看字面有点难理解,下面我们按照他的定义写一个demo,大家就会掌握快排了
首先给出一个无序数组
int[] array = new int[]{3,2,5,4,3,8,1,9}
我们现在取出一个数,取array[0]为基准点,排序过后分成两组使得左边的数全都小于这个基准点,右边的数全都大于这个基准点
此时我们定义两个游标,左边的为红色,右边的为绿色
3 | 2 | 5 | 4 | 3 | 8 | 1 | 9 |
↑ | ↑ |
1 | 2 | 5 | 4 | 3 | 8 | 1 | 9 |
↑ | ↑ |
1 | 2 | 5 | 4 | 3 | 8 | 5 | 9 |
↑ | ↑ |
1 | 2 | 5 | 4 | 3 | 8 | 5 | 9 |
↑↑ |
1 | 2 | 3 | 4 | 3 | 8 | 5 | 9 |
↑↑ |
这应该不难理解,下面我们直接上代码
public class FastSort {
public static void main(String[] args) {
int[] array = new int[]{3,2,5,4,3,8,1,9};
fastSort(array, 0, array.length-1);
print(array);
}
//快速排序
private static void fastSort(int[] array,int l,int r){
if(l >= r){
return;
}
int low = l;
int high = r;
int key = array[low];
while(low < high){
//当指针不重合时候,分别进行位移
for (;; high--) {
if(high <= low){
break;
}
//如果右侧数据小于基准值,则把右侧数据放入左侧游标所指的位置
if(array[high] < key){
array[low] = array[high];
break;
}
}
for (;; low++) {
if(high <= low){
break;
}
//如果左侧数据大于基准值,则把左侧数据放入右侧游标所指的位置
if(array[low] > key){
array[high] = array[low];
break;
}
}
}
//当两个游标重叠的时候,将基准值放入游标所指向的位置
if(low == high){
array[low] = key;
}
//分而治之
//对游标左侧递归
fastSort(array, l, low - 1);
//对游标右侧递归
fastSort(array, low + 1, r);
}
private static void print(int[] array){
System.out.println();
for (int i : array) {
System.out.print( i + ",");
}
}
}
在关键部分我已经写了代码注释,再按照上面的说明,应该不难理解,大家可以把代码拷出来试一下,如有疑问请留言,第一时间解答