AcWing 785. 快速排序

https://www.acwing.com/problem/content/787/

快排   双向指针

#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int n;
int q[N];
void quick_sort(int q[],int l,int r) {
    if(l>=r)  return ;
    int x=q[l],i=l-1,j=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;
}

原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11746273.html

时间: 2024-07-31 15:29:16

AcWing 785. 快速排序的相关文章

算法基础课相关代码模板

算法基础课相关代码模板 活动链接 -- 算法基础课 快速排序算法模板 -- 模板题 AcWing 785. 快速排序 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);

Acwing785.快速排序

Acwing785.快速排序 快排模板: y总教学大法好~: #include <iostream> using namespace std; const int N = 1000010; int q[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 ++ ;

快排+归并+整数二分

tips: 1.注意边界处理,避免出现死循环 785. 快速排序 /* eg:2 1 2 用i则不能取到左边界,把x取值改成向上取整 用j则不能取到右边界,把x取值改成向下取整 取到边界会导致递归死循环 */ #include<iostream> #include<cstdio> using namespace std; const int N=1e6+10; int n; int q[N]; void quick_sort(int q[], int l, int r){ if(l

Acwing-----基础课复习

第一讲:基础算法 785. 快速排序 链接:https://www.acwing.com/problem/content/787/ #include <iostream> using namespace std; const int N = 1000010; int q[N]; void quick_sort(int q[], int l, int r) { if (l >= r) return ; int x = q[(l + r) / 2], i = l - 1, j = r + 1

AcWing 107. 超快速排序(归并排序 + 逆序对)

在这个问题中,您必须分析特定的排序算法----超快速排序. 该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序. 对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 5 9. 您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序. 输入格式 输入包括一些测试用例. 每个测试用例的第一行输入整数n,代表该用例中输入序列的长度. 接下来n行每行输入一个整数aiai,代表用例中输入序列的具体数据,第i行的数据代表序列中第i个数. 当输入用例中包含

归并排序和快速排序模版

摘自Acwing 归并排序 1 #include <iostream> 2 using namespace std; 3 4 const int N = 1e5 + 10; 5 6 int n; 7 int q[N], tmp[N]; 8 void merge_sort(int q[], int l, int r) 9 { 10 if (l >= r) 11 return; 12 int mid = l + r >> 1; 13 merge_sort(q, l, mid),

快速排序

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 快速排序是一种不稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod). 该方法的基本思想是:

快速排序——Python

快速排序: 在一组数据中选择一个基准值,让后将数据分为两个部分,一部分大于基准,一部分小于基准,然后按此方法将两个部分分组,直到不能再分为止. 需要明白一个概念递归和分而治之的概念. Python实现: 1 # 快速排序 2 3 import random 4 5 def quick_sort(arr): 6 # 边界条件 7 if len(arr) < 2: 8 return arr 9 key = random.choice(arr) # 选择基准 10 left = [i for i in

快速排序的实现(不保证效率

众所周知,快速排序的核心是分治的思想,选一个基准出来,然后通过划分操作,使得,该元素最终处于的位置的左边的元素都小于等于它,右边的元素都大于等于它 划分操作就是两次递归嘛,没什么的,关键在于不借助外部空间我们如何实现划分操作 首先我们不知道该元素放在哪里,显然这是最后才能确定的, 我了解到一种填坑法的实现... 那就是首先保存第一个位置的值,然后从后向前扫描第一个小于x的值,我们就可以直接覆盖第一个位置的值,然后我们再从前向后找大于x的值, 把后面的坑填上 下面枚举几种情况 基准前后有相同数量的