快速排序 被称为对20世纪影响最大的算法之一 基本思想从每次当前考虑的数组中选择一个元素,以这个元素为基点,后面元素进行比较,然后排序成一边小于此基点的,一边大于此基点的,以此类推。
快速排序思想
以下图为例,先选择4为基点,再将4这个元素挪到排好序后它应当所处的位置。4这个元素处在了那个位置就有了一些性质:在4之前的元素都是小于4的,在4以后的元素都是大于4的。然后我们需要做的就是在小于4和大于4的数组里继续使用快速排序的思路继续排序,实现一个递归过程。
Java快速排序代码
package SF;
public class QuickSort {
private QuickSort() {
}
private static int partition(int[] arr,int l,int r) {
int v =arr[l];
int j=l;
for(int i=l+1;i<=r;i++) {
if (arr[i]<v) {
j++;
swap(arr,j,i);
}
}
swap(arr,l,j);
return j;
}
private static void sort(int[] arr ,int l,int r) {
if(l>=r)
return;
int p= partition(arr,l,r);
sort(arr,l,p-1);
sort(arr,p+1,r);
}
public static void sort(int[] arr) {
int n=arr.length;
sort(arr,0,n-1);
}
public static void swap(int[] arr,int i,int j) {
int t=arr[i] ;
arr[i]=arr[j];
arr[j]=t;
}
public static void main(String[] args) {
int [] arr= {2,4,3,1};
QuickSort.sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);;
System.out.print("");
}
}
}
在我这个Java快速排序中,我选择一个基点V,同时定义了两个索引,分别为j、i,其中用来j指向指向最后一个小于V的元素,i用来指向最后一个大于V的元素的下一位,然后进行排序(参考图片如下)。
总结
最后总结一下,这些算法需要理解他们过程,然后在去试着去做一下,中间不会也可以参考一下代码,你会发现其实也并不是那么难,继续努力吧!