快速排序(重要)

目录

1、基本思路

2、排序流程

3、代码

4、时间复杂度


1、基本思路

从待排的序列中任意选取一个元素(一般选第一个)作为分界值,与离它最远的元素进行比较。

将所有比它小的元素放在左边,比它大的放在右边。

经过一趟下来形成:左边子序列(都比分界值小),分界值,右边子序列(都比分界值大)。

再将左右两个序列按照上述方法进行排序,直到分不出子序列为止。

2、排序流程

举个例子:将下列数据按照从小到大的顺序进行快速排序。

49、38、65、97、76、13、27

第一趟,选择49为分界值,与最远的元素27进行比较。

27、38、65、97、76、13、49

第二趟,49与38进行比较

27、38、65、97、76、13、49

第三趟,49与65进行比较

27、38、49、97、76、13、65

第四趟,49与13进行比较

27、38、13、97、76、49、65

第四趟,49与97进行比较

27、38、13、49、76、97、65

此时,49大于左边的所有元素,小于右边的所有元素。

第五趟,左边序列选择27为分界值与13进行比较,右边序列选择76为分界值与65进行比较。

13、38、27、49、65、97、76

第六趟,左边序列27与38进行比较,右边序列76为分界值与97进行比较。

13、27、38、49、65、76、97

3、代码

public class QuickSort{
    public static void main(String[] args){
        //声明数组
        int nums[] = {49、38、65、97、76、13、27};
        //应用快速排序算法
        quickSort(nums, 0, nums.length-1);
        //显示排序后的数组
        for(int i = 0; i < nums.length; ++i){
            System.out.print(nums[i] + ",");
        }
    }

    public static void quickSort(int data[], int start, int end){
        int i = start;//从左往右比较的索引
        int j = end;  //从右往左比较的索引
        if(i >= j)    return;    //判断分界值是否到中间了,防止出现递归死循环。

        //当flag为true时,分界值与右边序列的元素比较大小;为false时,与左边序列的元素比较大小。
        boolean flag = true;

        while(i != j){    //当i与j相等时,该趟比较结束
            if(data[i] > data[j]){    //小的放左边,大的放右边
                int temp = data[i];
                data[i] = data[j];
                data[j] = temp;
                //元素交换的同时,也要修改flag标记
                flag = !flag;    
            }
            if(flag == true)    j--;
            else                i++;
        }

        //一趟排序完毕后,划分左右两个序列
        i--;
        j++;
        quickSort(data, start, i);//左边子序列再进行排序
        quickSort(data, j, end);//右边子序列再进行排序
    }  
}    

4、时间复杂度

最坏情况 O(n^2)

最好情况 O(n*log(n))

平均情况 O(n*log(n))

不稳定

感谢您的观看,希望你今天特别特别开心,加油~

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值