在博客上面看了很多大神的解析,自己慢慢的有了一点思路。
首先我认为快速排序就是采用了分治的思想 ,先找到其中一个数字作为基准,一般是第一个,然后找到它在这一组序列中间对应的真正位置,然后以这个数字为分界分为两组在分别采用一开始找第一个数字真正位置的方法,分别找到这两组对应的第一个数字的位置,然后再分,就这样一直分下去,直到所有的数字找到它们对应的真正位置,举个例子
1, 5, 1, 2, 0, 4, 9这几个数字,一开始是以第一个数字1为基准的,然后用两个变量low和high代表第一个数字和最后一个数字的位置
从末尾看,如果基准小于high所代表数字的大小,high减一,反之,用high位置对应的值替代low所代表的位置的值。再看头,如果基准值大于low所代表的值那么low加一,反之,用low位置所代表的值替代high位置所代表的位置的值,最后low和high相等的时候这个位置就是基准值也就是1的真正位置,基准位置如下变化
1 5 1 2 0 4 9
0 1 1 2 5 4 9
0 1 1 2 5 4 9
0 1 1 2 4 5 9
简单说明,左边一开始就有序了就不需要在确定基准了
最后贴上我的代码
public class QuicklySort {
public static void main(String args[]){
int []a = {1, 5, 1, 2, 0, 4, 9};
quicklySort(a, 0, a.length - 1);
System.out.print("排序后为:");
for (int i : a) {
System.out.print(i);
}
}
public static void quicklySort(int a[], int low, int high){
if(low >= high){
return;
}
int temp = a[low];//把初始值当做基准
int lower = low;
int higher = high;
/**
* 寻找基准的真正位置
*/
while(lower < higher){
/**
* 如果high点对应的值大于基准值high--
*/
while(lower < higher && temp <= a[higher]){
higher--;
}
/**
* high点对应值小于基准值就把high值给low点对应的值
*/
a[lower] = a[higher];
/**
* low点同理可得
*/
while(lower < higher && temp >= a[lower]){
lower++;
}
a[higher] = a[lower];
}
//此时对应的low和high应该相等,把基准值放入它正在对应的位置上面
a[lower] = temp;
/**
* 分别对前半部分和后半部分进行递归寻找新的基准
*/
quicklySort(a, low, lower - 1);
quicklySort(a, lower + 1, high);
}
}