快速排序
时间复杂度:O(n*log(2)n)
空间复杂度:O(n*log(2)n)
不稳定
核心代码
import java.util.Arrays;
/**
* 快排
* @author jin
*
*/
public class QuickSort {
public static void main(String[] args) {
int[] a={3,57,346,7,146,43,3,14,7,41,1,3465};
quickSort(a, 0, a.length-1);
}
public static void swap(int[] a,int i,int j){
a[j]=a[i]^a[j];
a[i]=a[i]^a[j];
a[j]=a[i]^a[j];
}
public static int sort(int[] a,int left,int right){
int key=a[left];
boolean flag=true;
while(right!=left){
if(flag){
if(key<=a[right]){
right--;
}else{
swap(a,left,right);
flag=false;
}
}else{
if(key>=a[left]){
left++;
}else{
swap(a,left,right);
flag=true;
}
}
}
a[left]=key;
return left;
}
public static void quickSort(int[] a,int left,int right){
if(left<right){
int mid=sort(a,left,right);
quickSort(a, left, mid-1);
quickSort(a, mid+1, right);
}
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}
}
快速排序是指,先选定一个key值,然后遍历这个数组,如果有比key值大的放右边,有比key值小的放左边,这样key值就跑到数组的中间了,key值就把原数组分成了左右两个子数组,然后用递归的方法再对key值左右两边的数组进行快速排序,直到全部排序完成。
步骤:
(1)一般选择第一个数为key值,有左右两个索引,左索引left此时等于0,指的是key值,右索引right此时等于a.length-1,指的是数组最后一个数。
int key=a[left];
(2)比较key值和a[right]的值,如果key<a[right]
,则right--
;如果key>a[right]
,则交换key和a[right]的位置;然后再反过来和左边的数进行比较。
boolean flag=true;
while(left!=right){//如果left=right的话,就说明key跑到中间了
if(flag){
if(key<a[right]){
right--;//如果key比右边的数小的话,就把右边的索引往前移一位
}else{
swap(a,left,right);//如果key比右边的数大的话,交换这两个数
flag=false;//交换完成后,key跑到右边了,此时开始和左边的数进行比较
}
}else{
if(key>a[left]){
left++;//如果key比左边的数大的话,左边的索引往后移一位
}else{
swap(a.left,right);//如果key比左边的数小的话,交换这两个数
flag=true;//交换完成后,key跑到左边了,此时开始和右边的数进行比较
}
}
}
(3)当key跑到数组的中间时,然后用递归的方法排序左右两个子数组。
void sort(int[] a,int left,int right){
if(left<right){
int mid=(key的索引);
通过递归的方法对左边的数进行排序:sort(a,left,mid-1);
通过递归的方法对右边的数进行排序:sort(a,mid+1,right);
}
}