数据结构-快速排序(Java)

算法思想

1、假设将数组划分为r[low],r[low+1],…,r[high],默认temp=arr[low]为基准记录,此时r[low]相当于空单元。
2、high从右向左扫描,知道r[high]<temp时,将r[high]移动到空单元r[low],此时r[high]相当于空单元。
3、low从左向右扫描,知道r[low]>temp时,将r[low]移动到空单元r[high],此时r[low]相当于空单元。
4、当low和high相遇时,r[low] (或r[high])相当于空单元,且r[low]左边的关键字全部小于基准记录temp记录的关键字,r[high]右边的关键字全部小于基准记录temp记录的关键字,最后将基准记录temp移至r[low]中,就完成一次快速排序过程。
5、采用递归,对temp左边的子表和右边的子表采用同样的方法进行一步划分。

代码
import java.util.Arrays;

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = {48, 62, 35, 77, 55, 14, 35, 98};
        QKSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));

    }

    // 完整的快速排序算法
    public static void QKSort(int[] arr, int low, int high) {
        if (low < high) {
            // 调用一趟快速排序算法,以枢轴元素为界划分两个子表
            int pos = oneQKsort(arr, low, high);

            // 对左部子表快速排序
            QKSort(arr, low, pos - 1);

            // 对右部子表快速排序
            QKSort(arr, pos + 1, high);

        }
    }

    // 一趟快速排序算法,low和high分别为坐下标和右下标
    public static int oneQKsort(int[] arr, int low, int high) {
        // 定义一个基准记录(标兵),默认数组第一个
        int tem = arr[low];

        while (low < high) {

            //从右到左找到小于基准记录的值
            while (low < high && arr[high] >= tem) {
                high--;
            }

            //找到小于基准记录的值,则送人“空单元”r[low]
            if (low < high) {
                arr[low] = arr[high];
                low++;
            }

            //从左到右找到大于基准记录的值
            while (low < high && arr[low] < tem) {
                low++;
            }

            //找到大于基准记录的值,则送人“空单元”r[high]
            if (low < high) {
                arr[high] = arr[low];
                high--;
            }

        }
        arr[low] = tem; //将基准记录的值保存到low = high的位置
        return low; //返回基准记录的值

    }
}
输出结果

稳定行:不稳定,反例{3,3,2}
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值