数据结构复习之–“快速排序”-JAVA实现

各种排序算法,平常不写的话很容易忘记,其中最让我怕的就是快速排序,刚刚学数据结构的时候,总感觉很复杂,总是到考试或者找工作的时候才会想着复习,每次复习了之后也就那样,没什么,但为什么我总感觉在心中有一种“畏惧感”,可能没有那么严重,但总感觉不太想碰它。以前复习的时候总是看看,没怎么实际写过,感觉理解原理就好了。现在感觉还是要多写写,而且要写完整。
我是用JAVA实现的具体如下,写的不好,仅供参考,勿喷!


import java.util.Scanner;
public class QuickSortTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 首先得到要输入数据的个数
        System.out.print("请输入待排序元素的个数:");
        int totalNums = sc.nextInt();
        // 从控制台输入数据到数组中
        System.out.println("请输入待排序的数据,以空格分隔:");
        int[] inputData = new int[totalNums];
        for (int i = 0; i < totalNums; i++) {
            inputData[i] = sc.nextInt();
        }

        show(inputData);
        QuickSort(inputData, 0, inputData.length - 1);// 进行快速排序
        show(inputData);
    }

    /**
     * Function:将数组中给定范围内的数据以选定的枢轴进行划分,最终枢轴左边的数据都比枢轴小,
     * 枢轴右边的数据都比枢轴大,默认枢轴为待划分数据的第一个元素
     * 
     * @param     dataArray 待排序整形数组
     * @param     low 划分范围的最左端位置
     * @param     high 划分范围的最右端位置
     * @return    当前划分中,枢轴在整个数组中的最终位置
     */
    static int Partition(int[] dataArray, int low, int high) {
        int pivokey = dataArray[low];// 将待划分数据的第一个元素作为枢轴
        while (low < high) {
            //high指向的位置开始,不断向左端移动,直到找到high指向的数据比枢轴的数值小
            while (low < high && dataArray[high] >= pivokey) --high;

            /*
             *此时high指向的数据比枢轴值小,将high指向的数据赋值给low指向的空间,
             *由于low指向位置的数据已作为枢轴保存起来,或者已经移动到了枢轴右端上次外层循环high指向的位置,
             *故此时low中的数据,可以被覆盖,总体看来就是将比枢轴小的数据移动到枢轴的左端
            */
            dataArray[low] = dataArray[high];

            //low指向的位置开始,不断向右端移动,直到找到low指向的数据比枢轴的数值大
            while (low < high && dataArray[low] <= pivokey) ++low;

            /*
             *此时low指向的数据比枢轴值大,将low指向的数据赋值给high指向的空间,
             *由于high指向位置的数据已经移动到了枢轴左端上次循环结束low指向的位置,
             *故此时high中的数据,可以被覆盖,总体看来就是将比枢轴大的数据移动到枢轴的右端
            */
            dataArray[high] = dataArray[low];
        }

        /*此时low==high,也是当前划分中枢轴应该所在的位置,
         * 此时枢轴左边的数据都比枢轴值小,枢轴右边的位置都比枢轴值大
         * 从另一个角度来看,每次划分的结束都相当与将选中的枢轴放到排序后其应该在的位置上
         */
        dataArray[low] = pivokey;

        return low;//返回此时划分枢轴的最终位置
    }


    /**
     * function:递归实现快速排序算法
     * 
     * @param dataArray  待排序整形数组
     * @param low        数组中排序的起点
     * @param high       数组中排序的终点
     */
    static void QuickSort(int[] dataArray, int low, int high) {
        if (low < high) {
            int partitionIndex = Partition(dataArray, low, high);
            //对当前划分左边的数据继续进行快速排序
            QuickSort(dataArray, low, partitionIndex - 1);
            //对当前划分右边的数据继续进行快速排序
            QuickSort(dataArray, partitionIndex + 1, high);
        }
        return;
    }

    /**
     * function:显示整数数组中的数据
     * @param array 待显示数组
     */
    static void show(int[] array) {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println("\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值