快速排序
快速排序(Quick Sort)算法,简称快排,利用的是分治的思想。
快速排序思路:
如果要对 first->end 之间的数列进行排序,我们选择 first->end 之间的任意一个元素数据作为分区点(轴值Pivot),然后遍历 first->end 之间所有元素,将小于pivot 的元素放到左边,大于pivot的元素放到右边,pivot放到中间,这样整个数列就被分成了三部分。first->i-1 之间的元素是小于 pivot 的,中间是 pivot,i+1->end 之间的元素是大于 pivot 的。然后再根据分治递归的思想处理两边区间的元素数列,直到区间缩小为 1,整个数列就有序了。
具体可见下图:
排序算法核心:
- 确定轴值,一般取序列中第一位置值
- 找到序列中轴值所在位置,放置轴值
- 将小于轴值的所有元素往轴值前面放置,大于轴值的元素往轴值后面放置
具体代码实现如下:
import java.util.Arrays;
import org.junit.Test;
/**
*
* @ClassName: QuickSort
* @author shaoyb
* @date 2020年12月8日
* @Description: 快速排序
* 快速排序算法思想
* 1、将序列中第一个元素,设置为“轴值”
2、对序列排序,所有比轴值小的元素摆放在轴值前面,比轴值大的摆在轴值后面(相同的数可以到任一边)。这样子操作完成后,该轴值就处于数列的中间位置,以上过程称为分区(partition)操作。
3、对轴值前的子序列和轴值后的子序列进行递归快速排序。
*/
import java.util.Arrays;
public class QuickSort {
//获取轴值的位置,并轴值为基准点调整序列位置
public int partition(int arr[],int first,int end)
{
int i = first;
int j = end;
//默认轴值为 arr[i];
while(i<j){
//让j从后往前移动
while(i<j && arr[i] <= arr[j])
j--;
if(i < j){
//交换i j位置的值
swap(arr,i,j);
//更新i的值
i++;
}
//让i从前往后移动
while(i < j && arr[i] <= arr[j])
i++;
if(i < j){
//再次交换i j位置的值
swap(arr,i,j);
j--;
}
}
return i;
}
//快速排序
public void quickSort(int arr[],int start,int end)
{
if(start >= end)
return;
//先分段
int index = partition(arr,start,end);
//对前半截快速排序
quickSort(arr,start,index-1);
//对后半截快速排序
quickSort(arr,index+1,end);
}
//交换数组中两个元素
private void swap(int[] arr, int i, int j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
public static void main(String[] args) {
int[] array = {3,7,9,1,2,6};
System.out.println("排序前: "+ Arrays.toString(array));
TestSort t = new TestSort();
t.quickSort(array, 0, array.length-1);
System.out.println("排序后: "+ Arrays.toString(array));
}
}