快速排序

来源:互联网 发布:六级分数算法 编辑:程序博客网 时间:2024/06/06 09:55

快速排序属于冒泡排序的一种改进,基本思想是,将一个数组分割成两个子数组,一个数组小于某个关键字,另外一个数组大于某个关键字,然后再对这两个数组进行同样的排序,直到所有数组成为一个有序的数组。这个关键字我们姑且叫它做哨兵,也就是根据这个哨兵值将一个数组分成两个数组。例如:[5,6,7,1,8,2,3]。通常我们都会将第一个作为哨兵,这里取5,那么先根据这个哨兵值将数组分成[3,2,1,5,8,7,6]。然后再将[3,2,1]这个子数组进行同样排序操作一直到整个数组有序为止。

具体步骤见下图:


以上的图片给出了前两次的交换,后面的交换也是类似,可自行推导。一趟交换之后数组就会被分割成[3,2,1,5,8,7,6],接下来就是不断重复这个步骤。看到这里可能还是会有疑问,接下来看代码怎么实现吧。

private int sort(int[] arr,int low,int high){int pivot = arr[low];while(low<high){while(low<high&&arr[high]>=pivot){high--;}arr[low] = arr[high];while(low<high&&arr[low]<=pivot){low++;}arr[high]=arr[low];}arr[low] = pivot;return low;}
这个是一趟排序的方法。首先取第一个元素作为pivot,然后开始从高到低遍历,并且拆分(实际上就是交换元素位置),当low大于high的时候说明这个数组已经被遍历了一遍了,这个时候已经将数组拆分成一部分大于pivot一部分小于pivot了。刚才说了这个是一趟排序的,要排好所有的元素肯定不是一趟排序就能搞定的(特殊情况除外)。现在的关键是第二趟排序怎么做?继续看:

public void quickSort(int[] arr,int low,int high){if(low<high){int partion = sort(arr,low,high);quickSort(arr,low,partion-1);quickSort(arr,partion+1,high);}}
这里通过递归的方式不断拆分并排序,首先如果low<high,说明这个数组还可以继续拆分,每次拆分都是伴随着排序的,也就是一开始说的一部分小于pivot一部分大于pivot,每次拆分完了之后就返回这个pivot的位置,下次拆分的时候就从这个pivot+1和pivot-1开始拆,也就是这个pivot经过一趟排序它已经找到合适的它的位置了,就像刚开始的5,经过一趟排序下来它就变成了[3,2,1,5,8,7,6],这个时候这个5已经找到了适合它的位置,那么下次我们只要对下标0到2,以及4到6进行拆分排序就可以了,依次类推。







原创粉丝点击