您的位置:首页 > 产品设计 > UI/UE

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 + " ");
}

}
}
结果如图所示:



学于慕课网。如有错误,请多指教!谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: