快速排序
概念介绍
有同学想了解快速排序,今天它来了!快速排序的基本思想是:通过一轮排序,将要排序的数据分为独立的两个部分,其中一部分的数据比另外一部分数据都要小。分成两部分后,再按上述方法对这两部分数据进行排序,整个排序过程是递归进行的。举个简单的例子,一个操场上有一群人,根据身高将人群分成两部分,身高在170CM以下的人群走到操场的左边,170CM以上的人群走到右边,这时候根据170CM这个身高值将人群划分了。接下来再对左右两部分进行重复的操作,左边的人群可以继续以160cm的身高进行划分,右边的人群可以根据180CM的身高进行划分,直至所有人的身高排序完成。
以[5,3,7,6,4,1,0,2,9,10,8]为例进行排序。设定pivot=5(以数组第一个数字为关键数字进行排序),左指针l=0,右指针r=9。从数组左边开始找,第一个大于等于pivot的数是arr[0]=5,从数组右边开始找,第一个小于等于5(pivot)的数是arr[7]=2,将这两个数进行交换,交换后序列为[2,3,7,6,4,1,0,5,9,10,8],此时l=0,r=7。
交换继续,从2开始往右找,左指针开始移动,第一个比5大的数是arr[2]=7,此时将7和5进行交换,交换后序列为[2,3,5,6,4,1,0,7,9,10,8],此时l=2,r=7。
交换继续,从7开始往左找,右指针开始移动,第一个比5小的数是arr[6]=0,此时将0和5进行交换,交换后序列为[2,3,0,6,4,1,5,7,9,10,8],此时l=2,r=6。
交换继续,从0开始往右找,左指针开始移动,第一个比5大的数是arr[3]=6,此时将6和5进行交换,交换后序列为[2,3,0,5,4,1,6,7,9,10,8], 此时l=3,r=6。
交换继续,从6开始往左找,右指针开始移动,第一个比5小的数是arr[5]=1,此时将1和5进行交换,交换后序列为 [2,3,0,1,4,5,6,7,9,10,8],此时l=3,r=5。
交换继续,从1开始往右找,左指针开始移动,直到l=5的时候,才有大于等于5的数,此时l=r=5,序列为[2,3,0,1,4,5,6,7,9,10,8],以5为界,将序列分为左右两部分,左边的都比5小,右边的都比5大,此时第一趟排序完成。接下来,我们可以对序列左右两部分继续进行递归,直至排序完成。
代码实现
public static void quickSort(int[] arr, int left, int right) { int pivot = arr[left]; // 选取数组的第一个值作为关键数据 int l = left; //左下标 int r = right; //右下标 while (l < r) { // 从左边开始找,直至找到大于等于pivot的值 while (l < r && arr[l] < pivot) { l++; } // 从右边开始找,直至找到小于等于pivot的值 while (l < r && arr[r] > pivot) { r--; } // 存在相等,直接移动指针 if(l<r && arr[l]==arr[r]){ l++; }else { //否则进行数据交换 int temp = arr[l]; arr[l] = arr[r]; arr[r] = temp; } } // 将左侧数据递归处理 if(l-1>left) quickSort(arr,left,l-1); // 将右侧数据递归处理 if(r+1<right) quickSort(arr,r+1,right); }
至此,代码编写完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于algorithm工程下的sort目录QuickSort,如果发现不足之处,请联系我进行更改,十分感谢!关注我,带你了解更多排序算法!