交换排序之快速排序 Java代码

交换排序之快速排序 Java代码

概念:在序列上找到一个pivot(基准),然后通过一次快速排序后,就会找到pivot在序列的位置,此时该序列以pivot基准划分为一个比pivot小的元素都在pivot的左边,比pivot大的元素都在pivot的右边。然后在pivot的左边和右边分别使用快速排序,一直到low大于high时就完成了序列的排序。(其中用到了递归的思想

算法思想:

                      第一步:找到一个pivot(基准),low和high(一般pivot选择序列的第一个元素,low为第一个元素,high为最后一个元素)

                      第二步:向前移动high的位置,直到找到一个比pivot小的元素

                      第三步:向后移动low的位置,直到找到一个比pivot大的元素

                      第四步:交换当前的两个元素

                      第五步:重复2,3,4步位置,直到low>high的时候停止。

例子:

排序序列为:5 7 5 8 6 9 1 4 3

因为high此时所在的元素为3小于了pivot的元素所以high不往前移动,接着就要把3这个元素与low位置的元素进行交换所以low位置的元素为3了(注意low位置的5元素已经给了pivot了所以不在怕覆盖了)。

因为low此时的元素为3小于了pivot的元素,所以会把low往后移动一位,此时low所在的元素是7大于了pivot了,所以需要与high交换元素,所以此时high所对应的元素为7。

再比较high所对应的元素与pivot的元素大小,发现high对应的元素大于了pivot所对应的元素,所以把high往前移动一位,此时high所对应的元素为4,再用4与pivot比较,发现high小于了pivot所以high不在往前移动了,接着就把4这个元素与与low位置的元素进行交换所以low位置的元素为4了(注意low位置目前是没有元素的,因为7元素在上面已经移动到了上衣给high位置了)。

此时low对应的元素为4,比较pivot的元素,发现小于pivot所对应的元素(5),所以low往后移动一位,所以此时low对应的元素为5,接着与pivot中的元素(5)比较(此时注意可以把等于认为小于pivot),所以再将low往后移动一位,此时low所对应的元素为1,再去和pivot比较,发现小于,再把low往后移一位,此时low所对应的元素为6,比较pivot,发现low的元素大于了pivot中的元素,所以把6元素交换到high此时的位置(就是先前4元素的位置);

high此时所对应的元素是6,比较pivot发现大于pivot(5),所以high往前移动一位,8和9都大于pivot所以high继续往前移动,最终low和high都移动到了原来是6元素这个位置,此时这个位置就是pivot的位置,此时就完成了一次快速排序。

就着递归调用在对5的左边和右边进行快速排序。

C代码:

 

java代码:

public class QuickSort {
    //快速排序的操作方法
    public static int Partition(int[] arr,int low,int high){
        int pivot = arr[low];
        while (low<high){
            while (low<high && pivot<=arr[high]){
                high--;
            }
            arr[low] = arr[high];
            while (low<high && pivot>=arr[low]){
                low++;
            }
            arr[high] = arr[low];
        }
        arr[low] = pivot;
        return low;
    }
    //快速排序
    public static void quickSort(int[] arr,int low,int high) {
        //找到pivot的位置
        int mid = 0;
        if (low<high){
            mid = Partition(arr,low,high);
            //递归调用快速排序对基准位置的左右都进行快速排序
            quickSort(arr,low,mid-1);//对基准左边进行快排
            quickSort(arr,mid+1,high);//对基准右边进行快排
        }
    }

    public static void main(String[] args) {
        int [] arr = {5,7,5,8,6,9,1,4,3};
        quickSort(arr,0,arr.length-1);
        for (int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值