Java实现快速排序算法

快速排序

一、 算法描述

快速排序是对冒泡排序的一种改进。在冒泡排序中,记录每次都是与相邻位置上的数据作比较,因此每次只能移动一个位置。而在快速排序中,记录的比较和移动都是从两端向中间进行的。
其主要思想:首先在待排序数组中选取一个基准值(作为比较对象),然后利用基准值将待排数组分成2个部分。基准值左边的数组的数据都小于或等于基准值;基准值右边的数组的数据都大于或等于基准值,然后分别对这两部分重复上述过程,直到整个数组变成有序数组。
显然,快速排序是一个递归的过程。

下面举例分析:
这里写图片描述

二、 算法分析

快速排序的趟数取决于递归的深度。

最好的情况:每次划分对一个记录定位后,该记录的左侧子序列与右侧子序列长度相等。
时间复杂度:O(nlog₂n)。

最坏情况:待排数组是正序或反序,那么每次划分都只能有一个子序列。
时间复杂度:O(n²)。

快速排序是一种不稳定的排序。

三、 算法实现(主要代码)

public class QuickSortArray {
    private void QuickSort(int[] arr, int lowIndex, int highIndex){
        int lo = lowIndex; //左侧扫描的标记位
        int hi = highIndex; //右侧扫描的标记位
        int povit = arr[lowIndex];  //选取数组第一个值为比较的基准值
        while(lo<hi){
            while(lo<hi && povit<=arr[hi]) //右侧扫描
                hi--;                      //右标记位向前移动一位
            if(lo<hi){                           //出现比基准值小的数
                System.out.println("");
                swap(arr,lo,hi);                 //交换2个值
                lo++;                            //左标记位向后移动一位
            }
            while(lo<hi && povit>=arr[lo])  //左侧扫描
                lo++;                       //左标记位向后移动一位  
            if(lo<hi){                      //出现比基准值大的数
                System.out.println("");
                swap(arr,lo,hi);            //交换2个值
                hi--;                       //右标记位向前移动一位
            }

        }
        //成功进行了第一次划分,下面分别利用递归对基准值左右两侧的数组进行快速排序
        if(lowIndex<lo){ 
            QuickSort(arr,lowIndex,lo-1);  
        }
        if(hi<highIndex){ 
            QuickSort(arr,lo+1,highIndex);
        }
    }

    private void swap(int[] arr, int lo, int hi) {   //交换数组的值
        int temp = arr[hi];
        arr[hi] = arr[lo];
        arr[lo] = temp;
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+",");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值