快速排序

快速排序

快速排序是目前已知的最快的排序算法,它是非稳定的原地的。它的时间复杂度平均情况下是 O ( n l o g n ) O(nlogn) O(nlogn),最差情况下是 O ( n 2 ) O(n^2) O(n2)。虽然如此,但是最坏情况是非常难达到的,而因为快速排序非常的紧凑,所以他成了最快的排序算法。

不过,快速排序也有缺点,由于不是稳定的排序算法,所以在很多情况下不可以使用快速排序。

模版:

判题地址:acwing:785. 快速排序

c++代码:

#include <iostream>
using namespace std;

const int N = 1e5 + 5;
int q[N];
int n;

void quick_sort(int q[], int l, int r) {
    if (l >= r) return;
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while ( i < j ) {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) scanf("%d", &q[i]);
    quick_sort(q, 0, n - 1);
    for (int i = 0; i < n; i++) printf("%d ", q[i]);
    return 0;
}

Java代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        InputStreamReader in = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(in);

        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];

        String[] res = br.readLine().split(" ");
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(res[i]);
        }

        quickSort(arr, 0, n - 1);

        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
        br.close();
    }
    
    public static void quickSort(int[] arr, int l, int r) {
        if (l >= r) return;
        int i = l - 1, j = r + 1, x = arr[l + r >> 1];
        while ( i < j ) {
            do i ++ ; while (arr[i] < x);
            do j -- ; while (arr[j] > x);
            if (i < j) swap(arr, i, j);
        }
        quickSort(arr, l, j);
        quickSort(arr, j + 1, r);
    }
    
    public static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
}

Python代码:

import sys

def quick_sort(arr, l, r):
    if l >= r: return
    i, j, x = l - 1, r + 1, arr[l + r >> 1]
    while i < j:
        i += 1
        while arr[i] < x: i += 1
        j -= 1
        while arr[j] > x: j -= 1
        if i < j: arr[i], arr[j] = arr[j], arr[i]
    quick_sort(arr, l, j)
    quick_sort(arr, j + 1, r)


if __name__ == '__main__':
    nums = []
    for line in sys.stdin:
        nums.append(list(map(int, line.split())))
    num = nums[1]
    quick_sort(num,0, len(num)-1)
    print(" ".join(map(str,num)))

三向切分快速排序:

这是基于快速排序的一个扩展。方法和快速排序类似,不同处是快速排序用一个数作为分界点,而和它相同的数可能在左边,也可能在右边。三向切分快速排序是将所有和选中的这个数相同的所有值都放在一起,这样分界点不是一个值,而是一段值。

三向切分快速排序的速度和快速排序差不多,对于相同数字较多的数组,排序比快速排序快很多,而相同数字不多的情况速度比快速排序稍慢一点点。

模版:

判题地址:acwing:818. 数组排序

c++代码:

#include <iostream>
using namespace std;

const int N = 1e5 + 5;
int q[N];
int n, l, r;

void quick_3way_sort(int q[], int l, int r) {
    if (l >= r) return;
    int lt = l, i = l + 1, gt = r, x = q[l];
    while ( i <= gt ) {
        if (q[i] < x) swap(q[lt++], q[i++]);
        else if (q[i] > x) swap(q[i], q[gt--]);
        else i++;
    }
    quick_3way_sort(q, l, lt - 1), quick_3way_sort(q, gt + 1, r);
}

int main() {
    scanf("%d%d%d", &n, &l, &r);
    for (int i = 0; i < n; i++) scanf("%d", &q[i]);
    quick_3way_sort(q, l, r);
    for (int i = 0; i < n; i++) printf("%d ", q[i]);
    return 0;
}

Java代码:

import java.util.Scanner;
import java.io.BufferedInputStream;

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

        quick3WaySort(arr, l, r);

        for (int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
    
    public static void quick3WaySort(int[] arr, int l, int r) {
        if (l >= r) return;
        int lt = l, i = l + 1, gt = r, x = arr[l];
        while (i <= gt) {
            if (arr[i] < x) swap(arr, lt++, i++);
            else if (arr[i] > x) swap(arr, gt--, i);
            else i++;
        }
        quick3WaySort(arr, l, lt - 1);
        quick3WaySort(arr, gt + 1, r);
    }
    
    public static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
}

Python代码:

import sys

def quick_3way_sort(arr, l, r):
    if l >= r: return
    lt, i, gt, x = l, l + 1, r, arr[l]
    while i <= gt:
        if arr[i] < x:
            arr[i], arr[lt] = arr[lt], arr[i]
            i += 1
            lt += 1
        elif arr[i] > x:
            arr[i], arr[gt] = arr[gt], arr[i]
            gt -= 1
        else:
            i += 1
    quick_3way_sort(arr, l, lt - 1)
    quick_3way_sort(arr, gt + 1, r)

if __name__ == '__main__':
    nums = []
    for line in sys.stdin:
        nums.append(list(map(int, line.split())))
    num = nums[1]
    quick_3way_sort(num, nums[0][1], nums[0][2])
    print(" ".join(map(str,num)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值