快速排序——一看就会,一写就废

news/2024/5/19 22:17:17 标签: 快速排序, 数据结构, 算法, java, 排序算法

快速排序

  • 原理:
  • 实现:
  • partition
    • hoare法:
      • 实现:
    • 挖坑法:
      • 实现:
    • 前后遍历:
      • 实现:
  • 非递归实现:

原理:

1、从待排序区间中选择一个数,作为基准值(pivot);
2、Partition:遍历整个待排序区间,将小于等于基准值放在基准值左边,将大于等于基准值的放在基准值右边;
3、采用分治思想,对左右两个区间相同方式处理,直到区间长度为1,代表有序,或者区间长度为0,代表没有数据。

实现:

当我们看见使用相同的方式处理,应该很快想到需要使用递归,但是使用递归,我们需要划定区间,所以需要quickRange,(至于partition方法如何实现,我们暂时不考虑)

java">public class QuickSort {
    public static void quick(int[] array) {
        quickRange(array, 0, array.length - 1);
    }

    private static void quickRange(int[] array, int from, int to) {
        int size = to - from + 1;
        if (size <= 1) {
            return;
        }
        int pivotIndex = partition(array, from, to);
        quickRange(array, from, pivotIndex - 1);
        quickRange(array, pivotIndex + 1, to);
    }
}

partition

那么我们如何实现partition的方法呢,如何将基准值左边都比基准值小,基准值右边都比基准值大呢?

hoare法:

找到一个基准值(习惯性找第一个),然后从区间前后开始,当左边比基准值小,就继续,直到找到一个比基准值大的元素停下来。右边也是直到找到比基准值小的元素停下来,然后交换两个位置,继续走…直到最后,再将基准值和中间位置交换。

实现:

java">    private static int partition(long[] array, int from, int to) {
        int left = from;
        int right = to;
        long poivt = array[from];
        while (left < right) {
            while (left < right && array[right] >= poivt) {
                right--;
            }
            while (left < right && array[left] <= poivt) {
                left++;
            }
            //交换
            Swap.swap(array, left, right);
        }
        Swap.swap(array, left, from);
        return left;
    }

挖坑法:

原理和Hoare法基本一致,唯一不同的就是,不进行交换,而是直接进行赋值(就想挖坑+填坑)

实现:

java">    private static int partition(long[] array, int from, int to) {
        int left = from;
        int right = to;
        long pivot = array[left];
        while (left<right){
            while (left<right&&array[right]>=pivot){
                right--;
            }
            array[left] = array[right];
            while (left<right&&array[left]<=pivot){
                left++;
            }
            array[right] = array[left];
        }
        array[left] = pivot;
        return left;
    }

前后遍历:

选定一个基准值,从前到后遍历无序区间,如果遇到比基准值小的,则将比基准值小的区间后面加上一个。
在这里插入图片描述

实现:

java">
    private static int partition3(long[] array, int from, int to) {
        long pivot = array[from];
        int s = from + 1;
        for (int i = from + 1; i <= to; i++) {
            if (array[i] < pivot) {
                Swap.swap(array, i, s);
                s++;
            }
        }
        Swap.swap(array, s - 1, from);
        return s - 1;
    }

非递归实现:

原理还是先处理基准值左边,在处理基准值右边,我们借助栈实现非递归过程:

java">public static void quickSort(long[] array) {
        Stack<Integer> stack = new Stack<>();
        stack.push(array.length - 1);
        stack.push(0);
        while (!stack.isEmpty()) {
            int left = stack.pop();
            int right = stack.pop();
            if (left >= right) {
                continue;
            }
            int pivotIndex = partition(array,left,right);
            stack.push(right);
            stack.push(pivotIndex+1);

            stack.push(pivotIndex-1);
            stack.push(left);
        }
    }

http://www.niftyadmin.cn/n/1530241.html

相关文章

归并排序(重要)

归并排序原理&#xff1a;分解&#xff1a;合并&#xff1a;非递归&#xff1a;原理&#xff1a; 归并排序&#xff08;mergeSort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法采用分治法。将以有序的子序列合并&#xff0c;得到一个完全有序的序列&…

排序算法性能分析和海量数据排序问题

排序算法性能分析时间和空间复杂度快速排序的优化海量数据排序问题&#xff1a;时间和空间复杂度 整理&#xff1a; 排序稳定性时间复杂度空间度复杂度最好最坏最好/平均/最坏最好/平均/最坏冒泡排序有序逆序稳定O(n) / O(n2) / O(n2)O(1)插入排序有序逆序稳定O(n) / O(n2) /…

二叉搜索树原理及操作

二叉搜索树原理构建二叉搜索树查找插入删除原理 二叉搜索树&#xff08;Binary Search Tree BST&#xff09; 又称为二叉排序树&#xff0c;它是一颗空树或者具有以下性质&#xff1a; 它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值它的右子树不为空&…

模拟实现HashMap

模拟实现HashMap模拟实现HashMap注意事项关于Set和Map区别&#xff1a;见链接&#xff1a; Set和Map 关于HashTable 见链接&#xff1a; 哈希表 模拟实现HashMap Node&#xff1a; public class Node {public String key;public Integer value;public Node next;public Nod…

SQL查询总结

查询聚合查询聚合函数GROUP BY 子句多次分组聚合HAVING联合查询内连接外连接自连接子查询[NOT] IN[NOT] EXISTSSQL基础语句查询为&#xff1a;SELECT * FROM student;聚合查询 聚合函数 常见的聚合函数有&#xff1a;MAX、MIN、AVG、COUNT、SUM 函数说明COUNT返回查询到数据…

猜数字游戏网页版

猜数字游戏网页版本猜数字游戏页面展示&#xff1a;具体实现&#xff1a;猜数字游戏 实现一个猜数字游戏。 随机产生一个数字&#xff0c;输入数字猜这个数字的大小&#xff0c;直到猜中这个数字。当你输入的这个数字小于这个随机数&#xff0c;提示猜小了&#xff0c;当你输入…

模拟实现红绿灯

模拟实现红绿灯模拟实现红绿灯模拟实现红绿灯 利用HTMLCSSJS实现红绿灯 效果&#xff1a; <!DOCTYPE html> <html lang"zh-hans"><head><meta charset"uft-8"><title>红绿灯</title><style>* {box-sizing: …

JS实现点名功能

JS实现点名功能描述实现对数组操作主要是使用 JS修改/操作DOM树的能力描述 利用JS实现点名功能&#xff0c;当在网页点下点击按钮的时候&#xff0c;随机点名&#xff0c;然后将点过名的同学插入到安全区&#xff08;下次不会点到&#xff09;&#xff0c;但是安全区的名字最多…