13、快速排序

  快速排序的核心操作是划分,通过某个数据将原来排序表分成两部分,前面部分比该数小,后面数据比该数据大或相等,该位置就为某数据排序后的位置,即该数据完成排序。如果定义一个排序表的划分方法为:

      int partition(int[] R,int low,int high);

  其中,low,high表示将数据R的第low个数据到high个数据进行划分,返回到整数为划分后到支点存储的位置;快速排序在查找分支点位置的方法有多种,本题目的排序过程中,首先从右向左移动,搜索小于分支记录的第一个元素,再从左向右移动,搜索大于分支记录的第一个元素,交互该两个记录值,继续搜索,直到两个搜索点交汇,如果交汇点记录与分支记录相等,分支记录与交汇点数据不交换,分支位置为交汇位置; 完成划分方法后,通过递归调用完成快速排序:

     void QuickSort(int[] R,int s,int t){
           if(s<t){
              int i=partition(R,s,t);
              QuickSort(R,s,i-1);
              QuickSort(R,i+1,t);
          }
     }

建议每次划分选择第一个元素为支点记录进行编程。给你到问题是,将标准输入的n个整数采用快速排序,并需要显示出每次划分分支点存储的位置,第一个数为0,分支点的输出顺序按照程序递归产生的分支点的先后进行输出,并完成该数据的排序。
输入: 标准输入,输入的第一行为整数的个数n值,第二行为n个整数,每个整数之间为一个空格。
输出: 标准输出,输出的第一行依次输出排序过程中使用的支点位置,每个输出数据之间使用一个空格隔开,第二行输出排序后的序列,每个输出数据之间使用一个空格隔开。

输入样例:
14
39 80 76 41 13 29 50 78 30 11 100 7 41 86
输出样例:
5 3 2 1 8 6 9 13 12 10
7 11 13 29 30 39 41 41 50 76 78 80 86 100

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        sc.close();

        QuickSort(arr);
        display(arr);
    }

    // 输出数组
    static void display(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            if (i > 0) System.out.print(" ");
            System.out.print(arr[i]);
        }
        System.out.println();
    }

    // 快速排序
    static void QuickSort(int[] arr) {
        QuickSort(arr, 0, arr.length - 1);
        System.out.println();
    }

    static void QuickSort(int[] arr, int left, int right){
        if(left < right){
            int i = partition(arr, left, right);
            QuickSort(arr,left, i - 1);
            QuickSort(arr, i + 1, right);
        }
    }
    static int partition(int[] arr, int l, int r) {
        int key = l;
        while (l < r) {
            while (l < r && arr[r] >= arr[key]) {
                --r;
            }
            while (l < r && arr[l] <= arr[key]) {
                ++l;
            }
            if (l < r) {
                swap(arr, l, r);
            }
        }
        if (arr[key] > arr[l]) {
            swap(arr, key, l);
        }
        System.out.print(l + " ");
        return l;
    }

    static void swap(int[] arr, int l, int r)  {
        int tmp = arr[l];
        arr[l] = arr[r];
        arr[r] = tmp;
    }
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qing影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值