先将快速排序的代码放上:
public class QuickSort {
public void quickSort( int[] List, int a, int b){
if(a<b){
int position=partition(List,a,b);
quickSort(List,a,position-1);
quickSort(List,position+1,b);
}
}
public int partition(int[] List, int a,int b){
//这里边返回第一个数字放在的位置
int temp= List[a];
while(a<b){
while(List[b]>=temp && a<b) b--;
List[a]=List[b];
while(List[a]<=temp && a<b) a++;
List[b]=List[a];
}
List[a] =temp;
return a;
}
}
public class Test {
public static void main(String args[]){
int[] list={3,4,6,1,2,8,10};
QuickSort qs=new QuickSort();
qs.quickSort(list, 0, list.length-1);
for (int i : list) {
System.out.println(i);
}
}
}
对应输出结果:
1 2 3 4 6 8 10
之前在写的时候,细节方面把握的不是很到位,在这里把实现的思路再捋一遍。
思想是左右交替的去替换位置,下面举个例子,理解起来会容易些:
初试数组: 3,4,6,1,2,8,10
基准数字是3,数组的开头结尾各有一个指针 ,分别记为 i , j ( i用来往后找,j用来往前找)
先用临时变量暂存第一个数字 3 , a 指向第一位,b指向最后一位
while语句的顺序是很重要的,之前想了很久。一定要先从后数,即计算 b-- 的这个循环。
在循环的过程中,b 依次指向 10, 8 ,2 。 到达2时候跳出循环,将值赋给a的位置 , 即:
2,4,6,1,2,8,10
然后从前数,进入a 的循环,a 依次指向2,4。 到达4时跳出循环, 将值赋给 b的位置,即:
2,4,6,1,4,8,10
以此类推:
2,1,6,1,4,8,10
2,1,6,6,4,8,10
截止到现在,外层的循环都走完了,还差一步:
最后,将暂存的第一位的数字3 放到a指向的位置,(我理解的是因为第一位的位置是处于比自身小的那一个方向,因此需要跟比它小的一组中最靠右的一个元素交换)
2,1,3,6,4,8,10
这样第一层走完了,接下来便是调用递归不断的去调整数字的位置直至排出大小顺序。
容易混淆的是交换值的顺序的环节,可能还是需要具体的例子来说明一下会清晰一些。