快速排序
关键字:分治
字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
时间复杂度:
要点:
1.递归结束条件
2.得到基准元素
3.根据基准元素位置,划分两部分排序
4.设置第一个元素为基准元素,第一个位置为mark
5.遍历,比较,mark右移,交换
6.最终交换,mark指向位置元素与基准元素
效果图
代码:单边循环法
public static void quickSort(int[] arr,int startIndex,int endIndex)
{
//递归结束:startIndex大于或等于endIndex
if(startIndex>=endIndex)
{
return;
}
//排序并拿到基准元素位置
int pivotndex=partition(arr,startIndex,endIndex);
//根据基准元素位置,数组分开成两部分再进行排序
quickSort(arr,startIndex,pivotIndex-1);
quickSort(arr,pivotIndex+1,endIndex);
}
//分治(单边循环法)
//arr 待交换数组
//startIndex 起始下标
//endIndex 结束下标
public static int partition(int[] arr,int startIndex,int endIndex)
{
//设置第一个位置为基准元素
int pivotElement=arr[startIndex];
//mark指向第一个基准元素,mark表小于基准元素区域边界
int mark=startIndex;
//遍历排序交换
for(int i=startIndex+1;i<endIndex;i++)
{
//遍历元素小于基准元素
if(arr[i]<pivotElement)
{
//mark右移一位
mark++;
//mark指向的元素与遍历元素进行交换
arr[mark]=arr[mark]^arr[i];
arr[i]=arr[mark]^arr[i];
arr[mark]=arr[mark]^arr[i];
}
}
//最后把mark指向的元素与基准元素pivotElement交换
arr[stratIndex]=arr[mark];
arr[mark]=pivotElement;
//主方法
public static void main(String[] args)
{
int[] arr=new int[]{4,4,6,5,3,2,8,1};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
//代码:40行
}
背单词:
pivot /ˈpɪvət/ 基准
partition /pɑːˈtɪʃn/ 划分
mark /mɑːk/ 标志