一.快速排序介绍
快速排序(Quick Sort)概念:是由冒泡排序改进而得到的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序。如果能通过两个(不相邻)记录的一次交换,消除多个逆序,则会大大加快排序的速度。快速排序方法中的一次交换可以消除多个逆序。
二.算法原理
快速排序的算法原理:在待排序的n个记录中任取一个记录(通常取第一个记录)作为基准数(与其他记录比较的数),设其关键字为pivotkey。经过一趟排序后,把所有关键字小于pivotkey的记录交换到前面,把所有关键字大于pivotkey的记录交换到后面,结果将待排序记录分成两个子表,最后将基准数放置在分界处的位置。然后,分别对左右子表重复上述过程,直至每个子表只有一个记录时排序完成。
三.实现代码(Java实现)
public static void FastSort(int[] arr,int i,int j) { /** * 实现思路: * 在数组随便选择一个作为基准数,默认是数组第一个 * 需要两个伪指针指向在数组两边的元素并向内逐一与基准数比较 * 左边指针 为 left 专门查找比基准数大的数,右边指针 right 专门查找比基准数小的数 * 若left>right则逻辑不成立 * 在满足left<right的情况下,left和right且找到了满足值,则进行交换 * 当left和right重合或者left>right时就不再查找了,将基准数归位,即放到一个分界点位置,左边数小于基准数,右边大于基准数 * 递归调用本函数,重新设定指针left,right的所指的位置 * * 下面注释所说的指针只是方便解释! */ if(i>j) return; int left = i; //left为左指针 int right = j; //right为右指针 int temp = arr[i]; //临时保存基准数 while(left < right) { //满足left < right,即可开始下一轮的查找 while(arr[right] >= temp && left < right) { //当右指针所指的数比基准数大且left < right,查找下一个 right--; } while(arr[left] <= temp && left < right) { //当左指针所指的数比基准数小时且left < right,查找下一个 left++; } if(left < right) { //当左边位置<右边位置时,就交换数值 int t = arr[left]; arr[left] = arr[right]; arr[right] = t; } } //将基准数归位到分界点,这里的分界点位置以left或者right都行。 arr[i] = arr[left]; arr[left] = temp; FastSort(arr,i,left-1); //基准数两边递归调用 FastSort(arr,left+1,j); }
强调:
1.在上面代码的情况,实际上不可能会出现left > right的情况,都是在left = right的时候,不满足left<right而while就终止掉了;你看上面的代码都加了left<right的判断,你不信自己尝试下。
2.记住如果基准数在数组的左边,那么必须从right先开始,因为从right先开始就能保证right右测的数一定是大于基准数的,到时候left和right处在同一个位置时,此位置的右边一定是比基准数大的;具体原因还是因为受left<right这个条件的限制,可以自己debug看下整个过程。
main方法测试:
public static void main(String[] args) { //创建一个无序数组 int[] arr = new int[] {2,3,1,4,5,7,6,8,10,9}; //调用快速排序方法,返回一个排序后的方法 FastSort(arr,0,arr.length-1); //遍历数组 System.out.print("最终结果:"); for(int i=0;i<arr.length;i++) { System.out.print(arr[i]+" "); } }
OK,如果有任何疑问可在下面留言!