一.算法思想
1、选出一个枢轴元素pivot,一般是最左边或是最右边的。
2、定义一个low和一个high,low从左向右走,high从右向左走。(需要注意的是:若选择最左边的数据作为pivot,则需要high先走;若选择最右边的数据作为pivot,则需要low先走)。
3、在走的过程中,若high遇到小于pivot的数,则停下,low开始走,直到low遇到一个大于pivot的数时,将low和high的内容交换,high再次开始走,如此进行下去,直到low和high最终相遇,此时将相遇点的内容与pivot交换即可。(我选取最左边的值作为pivot)
4.此时pivot的左边都是小于pivot的数,pivot的右边都是大于pivot的数,pivot处于最终的位置上
5.将pivot的左序列和右序列再次进行这种单趟排序,如此反复操作下去,直到左右序列只有一个数据,或是左右序列不存在时,便停止操作,此时此部分已有序
二.代码实现
package Sort;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] a = {49, 38, 65, 97, 76, 13, 27, 49};
System.out.println("原始数组为" + Arrays.toString(a));
quickSort(a,0,a.length-1);
System.out.println("最终排序的结果为" + Arrays.toString(a));
}
public static void quickSort(int[] a,int low,int high){
if(low<high){
int pivotpos=Partition(a,low,high);
quickSort(a,low,pivotpos-1);
quickSort(a,pivotpos+1,high);
}
}
public static int Partition(int[] a,int low,int high){
int pivot=a[low];
while (low<high){
while (low<high && a[high]>=pivot){
high--;
}
a[low]=a[high];
while (low<high && a[low]<pivot){
low++;
}
a[high]=a[low];
}
a[low]=pivot;
return low;
}
}
三.执行结果
四.算法性能
1.时间复杂度:O(nlogn)
2.空间复杂度:O(logn)
3.稳定性:不稳定