快速排序——java

快速排序
时间复杂度: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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值