快速排序 java与python实现

本文深入探讨了快速排序算法,一种高效的排序方法,通过分治策略实现原地排序,避免了额外空间的使用。提供了Java和Python两种语言的实现代码,演示了如何通过随机选择主元进行排序,最终达到O(nlogn)的时间复杂度。

快速排序QuickSort

快速排序由于排序效率在同为 O(nlogn) 的几种排序方法中效率最高,因此经常被采用。

快速排序思想与归并一样采用分治思想,相比于归并排序,快速排序属于原址排序,不需要创建额外的数组协助。

 

Java实现,随机选择主元

import java.util.Arrays;
import java.util.Random;
 
/**
 * 分治思想
 * 随机选择主元
 * 时间复杂度theta(nlogn)
 * @author Shine
 */
public class QuickSort {
 
    public static void quickSort(double[] arr, int from, int to) {
        if (from < to) {
            int q = randomPartition(arr, from, to);
            quickSort(arr, from, q - 1);
            quickSort(arr, q + 1, to);
        }
 
    }
 
    private static int randomPartition(double[] arr, int f, int t) {
        // 随机选择主元,替换到数组尾部
        Random ran = new Random();
        int i = ran.nextInt(t - f) + f;
        swap(arr, i, f);
        return partition(arr, f, t);
    }
 
    private static void swap(double[] arr, int i, int j) {
        if (i < arr.length && j < arr.length) {
            double temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
 
    }
 
    private static int partition(double[] arr, int f, int t) {
        // 
        double tail = arr[t];
        int i = f - 1;
        for (int j = f; j <= t - 1; j++) {
            if (arr[j] <= tail) {
                i += 1;
                swap(arr, i, j);
            }
        }
        swap(arr, i + 1, t);
        return i + 1;
    }
 
    public static void main(String[] args) {
 
        double[] arr = new double[]{1.5, 0.7, 3.4, -1.6, 2.3, -0.4, 0};
         System.out.println("Before sort:" +Arrays.toString(arr));
        quickSort(arr, 0, arr.length - 1);
        System.out.println("After sort:" +Arrays.toString(arr));
    }
}

 输出结果:

run:
Before sort:[1.5, 0.7, 3.4, -1.6, 2.3, -0.4, 0.0]
After sort:[-1.6, -0.4, 0.0, 0.7, 1.5, 2.3, 3.4]
成功构建 (总时间: 0 秒)

Python3实现

def quicksort(seq, lo, hi):
    """快速排序 Theta(N^2)"""
    """选择一个元素作为主元,把原始序列按照不大于主元的和大于主元的分成两部分递归"""
 
    if lo < hi:
        tag = quickpartition(seq, lo, hi)
        quicksort(seq, lo, tag-1)
        quicksort(seq, tag + 1, hi)
    return seq[lo:hi]
 
 
def quickpartition(seq1, lo1, hi1):
    x = seq1[hi1]
    i = lo1 - 1
    for j in range(lo1, hi1):
        if seq1[j] <= x:
            i = i + 1
            temp = seq1[i]
            seq1[i] = seq1[j]
            seq1[j] = temp
    temp1 = x
    seq1[i + 1] = temp1
    seq1[hi1] = seq1[i + 1]
    return i + 1
 
 
if __name__ == '__main__':
    test1 = [15, 5.4, 6, -9.23, 4, 0, -5, -8, -2.96]
    print("seq")
    print(test1)
    print("Quicksorted seq")
    quicksort(test1, 0, len(test1) - 1)
    print(test1)

 seq
[15, 5.4, 6, -9.23, 4, 0, -5, -8, -2.96]

Quicksorted seq
[-9.23, -8, -5, -2.96, 0, 4, 5.4, 6, 15]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值