快速排序
特点:高效,时间复杂度为nlogn。
原理:采用分治法的思想:首先设置一个中间值(一般以数组的第一个元素),然后以这个中间值为划分基准将待排序序列分成比该值大和比该值小的两部分,将这两部分再分别进行快速排序
直到序列只剩下一个元素
快速排序实现步骤:
1、选择一个基准点(一般为数组的第一个元素)
2、选择记录排序的开始下标(low),终点(high)下标。
3、循环终点下标所指元素和基准点比较,前者大,不动位置,下标-1
4、碰到比基准点小的数据,将其赋值给low下标指向的元素。(第一次覆盖的是基准点的位置。下面的覆盖都是交换完之后覆盖的。)
5、循环开始下标(low)所指元素和基准点比较,前者小的,不动位置,下标++
6、碰到比基准点大的数据,将其赋值给high下标指向的元素。
7、循环完毕,开始下标和终点下标重合,将基准点赋值给重合位置的元素。
8、第一遍排序完成。
9、将排序完成的分为两部分,继续递归排序,
基准点左边的小的数据递归排序
基准点右边的大的数据递归排序(需要增加递归结束条件)
图片来自网络,侵删
public class QuickSort {
public static void main(String[] args) {
int[] arr={3,2,6,1,8,9,7,0,4,4};
quickSort(arr,0,arr.length-1);
//System.out.println(Arrays.toString(arr));//一次排序结果:[0, 2, 3, 1, 8, 9, 7, 6, 4, 4]
System.out.println(Arrays.toString(arr));//排序结果:[0, 1, 2, 3, 4, 4, 6, 7, 8, 9]
}
//快速排序采用的是分治法+递归
/**
* @param start 数组开始排序的位置
* @param end 数组结束排序的位置
*
* */
public static void quickSort(int[] arr,int start,int end)
{
if(start<end)
{
//定义一个基准点。不能写arr[0],因为后面还需要递归使用。
int basic = arr[start];
//记录排序的下标
int low = start;
int high = end;
//循环查找比基准线大或小的数据
while(low<high)
{
//找到比基准线大的数据不动位置,hight下标继续往前移动。
while(low<high&&basic<=arr[high])
{
high--;
}
//直到找到比基准线小的数据,执行将小的数据替换到基准线左边
arr[low]=arr[high];
//找到比基准线小的数据不动位置,low下标继续往后移动。
while(low<high&&arr[low]<=basic)
{
low++;
}
//直到找到比基准线大的数据,执行将大的数据替换到基准线右边
arr[high]=arr[low];
//再次进入循环
}
//low和high重合之后,将标准数付给重合的位置
arr[low]=basic;
//将其分为两部分再次递归快速排序
quickSort(arr,0,low);
quickSort(arr,low+1,end); //需增加结束条件。start<end,每次low+1,直到low>end
}
}
}