快速排序的思想:用分治的策略,将数组分的越来越小,再每组中来比较数组元素之间的大小
快速排序的实现方式:
1.分别设置两个指针来指向数组的首元素和尾元素
2.一般将数组的首元素来作为一个枢纽元素(也就是其他的元素需要跟这个元素来比较大小,比这个元素大的需要放在它的右边,比它小的需要放在这个元素的左边)
3.采用递归的思想来实现上述两步。
快速排序的实现代码:
public class fastSort { public static Integer position(int[] a,int low,int high){ //存储枢纽值 int temp = a[low]; while(low<high){ //从后向前扫描的条件 while(high>low&&a[high]>temp){ high--; } //跳出来说明high<low||a[high]<temp; a[low] = a[high]; //从前向后扫描的条件 while(low<high&&a[low]<temp){ low++; } //跳出来说明low》high||a[low]>temp; a[high] = a[low]; //将temp归为 a[low] = temp; } //跳出来说明low和high相同 return low; } public static void sort(int[] a,int low,int high){ if(low>=high){ return; } int position = position(a,low,high); //进行递归 sort(a,low,position-1); sort(a,position+1,high); } public static void main(String[] args) { int[] a = {5,4,3,2,1}; fastSort.sort(a, 0, a.length-1); for(int s : a){ System.out.println(s); } } }
程序中不需要每次都将枢纽元素放在数组中,只需要每趟遍历结束后,
放在low=high的位置就好了
解释下a[low] = a[high]或者a[high] = a[low]的意思
说明一下:因为其实快速排序每次的交换是需要枢纽元素和被交换元素之间交换位置的,所以我们也就需要知道枢纽每次被交换的位置,但其实我们在程序中并没有在每次交换都将枢纽元素放在相应的位置,而是在每趟结束之后,在交换。所以解释如下:
1.low指针和high指针 在最开始都是指向数组头和数组尾的,枢纽元素在low指针所指向的位置。
2.若a【high】< 枢纽 ,此时a[low]所代表的地址空间是指向枢纽的,a【low】 = a【high】是将小于枢纽的元素移到了相应的位置,注意此时我们并没有交换枢纽的位置,按照交换规则我们知道枢纽应该放在a【high】的位置,这样枢纽就和被交换元素之间交换了位置。
3.通过第二部分析我们知道,其实枢纽每次需要交换的位置就是a[low]或者a[high]的位置。
希望我的思路可以帮助大家理解,因为我在学习快排的时候就不懂这里,所以分享出来帮助不懂的人来理解。有不正确的地方请大家指正!