快速排序
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码
快速排序(QuickSort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将需要排序的数据分成独立两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按照此方法对这两组数据分别进行快速排序,这个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序是实践中的一种快速的排序算法,在对 Java基本类型的排序中特别有用。它的平均运行时间是
。该算法之所以特别快,主要是由于非常精练和高度优先的内部循环(递归)。它的最坏情形性能为
,但进行简单修改就可以使该情形极难出现。下面描述最常见的快速排序的实现 “经典快速排序”。原理视频:链接
首先理解快速排序的思想,继而根据思想编写代码即可。
/**
* 快速排序:思想:先将最后一个元素获取出来,作为枢纽元(pivot),开始移动左右指针
*/
public class QuickSort {
public static void main(String[] args) {
Integer[] a = {44,33,66,2,4,88,44,62,49,23,43,89,50};
//Integer[] a = {44,44,44,44,44,44,44,44,44,44,44,44,50};
new QuickSort().sort(a,0,a.length-1);
List<Integer> ints = Arrays.asList(a);
for(int i: ints){
System.out.printf(i + " ");
}
}
//传入目标数组,左索引和右索引
public void sort(Integer[] arr , int left, int right){
int l = left;
int r = right-1;
//当 left < right 的情况下进行无限循环
while(left < right && l >= 0 && r >= 0 && l < right && r < right){
//循环获取 l > 最后一个元素的数据
while(arr[l] < arr[right]){
l++;
}
//循环获取 R < 最后一个元素的数据,这里添加等于是防止大量相同的元素的时候,r和l指针都不移动则会出现问题;
while(arr[r] >= arr[right] && r > 0){
r--;
}
//如果l 与 r 指针符合逻辑则交换彼此的数据
if(l < r){
//交换数据
swap(arr , l, r);
//如果两个相等,或者l > r 那么就说明比较结束,交换 l 与枢纽元 pivot
}else{
swap(arr , l, right);
//递归调用:对最左边的进行排序,l是当前的中间值
//注意这里不要使用 --l 因为 --l 会改变l的值,举个例子,L=6时,--L后l=5 L-1 后 L=6 ,我们后面的 l+1需要初始的L值所以,不要使用 L--
sort(arr , left, l-1);
//递归调用:对最右边的进行排序,l是当前的中间值
sort(arr , l+1,right);
break;
}
}
}
//交换方法
public void swap(Integer[] arr ,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}