Java实现-快速排序(QuickSort)
2018-02-26 23:33
239 查看
一. 快速排序的基本思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。如图所示:
从当前的数组中选取一个元素,将这个元素作为基点,一般选取第一个元素:“4”作为基点。
之后再想办法把“4”挪到排好序的时候应该所处的位置,如图所示:
“4”出现在这个位置,使得“4”之前的元素全部小于“4”,而“4”之后的元素全部大于“4”。
然后,再使这两部分(< 4 的子数组 和 > 4 的子数组)按照快速排序的思路,递归调用快速排序的方法。完成整个排序过程。
为此,我们可以加深理解对快速排序的基本思想:
如何把一个选定的元素,比如说这个“4”,挪到正确的位置上,而这个过程就是快速排序的核心。
---------------------------------------------------------------------------------------------------
二. 快速排序的过程---Partition
通常选择第一个元素作为“分割点”,如图所示,下标 l (left的意思)然后逐渐选出两个部分,一个小于v,一个大于v。
而记录这两个部分的分界点为 下标 j。
遍历当前的元素 e ,下标为 i。
从上图可以看出:
在闭区间 [ l+1 ... j ] 这个区间的所有元素 都小于 v
在闭区间 [ j+1 ... i-1 ] 这个区间的所有元素 都大于v
接下来分两种情况:
1. 当 e 大于 v 时。则纳入“ > v ”的部分。如图所示
2.当 e 小于 v 时。 则 j++,j 下标移动到大于v的部分,将其元素与e进行交换,这样e会纳入小于v的部分。
而交换的元素还是在大于v的部分。如下图所示:
当 i 遍历完所有元素后,再将 下标 l 与 下标 j 进行 交换 ,则将元素 v 放到了正确的位置了
---------------------------------------------------------------------------------------------------------
三. Java代码实现快速排序算法:
package Algorithm; /** * Created by Hubbert on 2018/2/26. */ public class TestQuickSort { //交换数组的函数 public static void swap( int [] arr , int i , int j ){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static int partition ( int [] arr , int l , int r ) { //先获取最左边的元素 int v = arr[l]; int j = l ; //从l+1 开始遍历 , r为最右边的数组下标 for ( int i = l + 1 ; i < r ; i++ ) { //当当前下标大于v,则继续遍历下一个元素 //所以直接判断小于v的元素 if ( arr[i] < v ) { j++; swap(arr, j , i); } } swap( arr , l , j ); return j; } //进行递归调用,进行排序 public static void sort( int [] arr , int l , int r ){ if( l >= r ){ return; } int partition = partition(arr,l,r); sort(arr,l,partition - 1); sort(arr,partition + 1 , r); } public static void sort( int [] arr ){ sort(arr,0, arr.length - 1 ); } public static void main( String [] args ){ //3种创建数组的方式: //1. int [] arr = {4,6,2,3,1,5,7,8}; //2. //int [] no_2 = new int [6]; //3. //int [] no_3 = new int[]{4,6,2,3,1,5,7,8}; sort(arr); for( int i : arr ){ System.out.print(i + " "); } } }结果如图所示:
学于慕课网。如有错误,请多指教!谢谢
相关文章推荐
- 一种简单的用java实现快速排序(Quicksort)
- 快速排序(QuickSort)原理及Java 实现
- 数据算法之快速排序(quickSort)的Java实现
- 快速排序(QuickSort)原理及Java 实现
- 数据算法之快速排序(quickSort)的Java实现
- Java 快速排序(QuickSort)原理及实现代码
- 随手编程---快速排序(QuickSort)-Java实现
- 一种简单的用java实现快速排序(Quicksort)
- Java 快速排序(QuickSort)原理及实现代码
- 排序算法复习(Java实现)(三): 插入,冒泡,选择,Shell,快速排序
- Java实现快速排序
- 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 《算法导论的Java实现》 8 快速排序
- 快速排序(Quicksort)的Javascript实现
- 快速排序(QuickSort)的C#实现(采用随机化主元方式)
- java实现快速排序
- 算法导论Java实现-快速排序(第七章)
- 用JAVA实现排序算法之四:快速排序
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 排序算法复习(Java实现): 插入,冒泡,选择,Shell,快速排序