快速排序——快速将字符串数组进行排序

本文深入解析了快速排序算法的原理及实现过程,通过实例演示如何利用快速排序对字符串数组进行排序,详细介绍了算法步骤,包括设置基值、双指针移动等,并提供了完整的Java代码示例。同时,分析了快速排序的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序

题目:输入一个字符串数组,使用快速排序进行排序;

eg:

["text","next","do"]

排序后

["do","next","text"]

一、快速排序的原理

快速排序其实就是快速的找到当前值在数组中的所在位置;
使用前后指针,low指向位置0,high指向lengh- 1位置;
开始排序:
1、将low指针指向的数值设置为基值tmp;
2、从high指针开始移动,当前数值大于基值tmp,high–;当前数值小于基值tmp,将high的值赋给low,low++;
3、low指针开始运动,当前数值小于基值tmp,low++;当前数值大于基值tmp,将low的值赋给high,
high–;
4、当high==low时,当前位置即是基数tmp的位置;

二、快速排序举例

在这里插入图片描述
1、设置当前数组中指针,low=72,high=85;
2、设置基数tmp,tmp=72;
3、从high指针开始移动,high=85,大于tmp,high–;
4、high=48,小于tmp,则low=48,low++,即ints[0] = 48;
5、low=6,小于tmp,low++;
6、low=57,小于tmp,low++;
7、low=88,大于tmp,则high=88,high–,即ints[8] = 88;
在这里插入图片描述
8、high=73,大于tmp,high–;
9、high=83,大于tmp,high–;
10、high=42,小于tmp,则low=42,low++;即ints[3]=42;
11、low=60,小于tmp,low++;
12、low=high,则当前位置为tmp的位置,即ints[5]=tmp;
在这里插入图片描述
找到当前基数72的准确位置,根据当前数值将数组分为三部分:1、小于基数;2、基数;3、大于基数;
将小于和大于基数的部分再次进行排序即可得到排序好的数组

三、代码

public class QuickSort {
    public static void main(String[] args) {
        String[] array={"text","aext","do"};
        String[] strings = quick_sort(array);
        for (String s:strings) {
            System.out.println(s);
        }
    }
    //判断数组的独特:是否为空||大小<=1
    public static String[] quick_sort(String[] array) {
        if (array == null || array.length <= 1) {
            return array;
        }
        return AdjustArray(array, 0, array.length - 1);
    }

    //分治算法,分为三部分进行排序
    public static String[] AdjustArray(String[] array, int low, int high) {
        if (high <= low) {
            return array;
        }
        //分为三部分:即分治算法
        int tmp = quickSort(array, low, high);
        AdjustArray(array, low, tmp - 1);
        AdjustArray(array, tmp + 1, high);
        return array;
    }

    //排序算法
    public static int quickSort(String[] array, int low, int high) {
        String tmp = array[0];
        while (low < high){
            while (low < high && array[high].compareTo(tmp)>=0){
                high--;
            }
            if(low < high && array[high].compareTo(tmp) < 0){
                array[low] = array[high];
                low++;
            }
            while (low < high && array[low].compareTo(tmp) <= 0){
                low++;
            }
            if(low < high && array[low].compareTo(tmp) >0){
                array[high] = array[low];
                high--;
            }
        }
        array[low] = tmp;
        return low;
    }
}

四、时间和空间复杂度

最优情况下时间复杂度:O( nlogn )
最差情况下时间复杂度:O( n^2 )
平均情况下时间复杂度:O(nlogn)
平均情况下时间复杂度:O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值