快速排序算法思想以及快速排序C/C++代码

785 快速排序

题目链接:acwing 快速排序题目

题目描述

给定你一个长度为n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。

输出格式

输出共一行,包含 n 个整数,表示排好序的数列。

数据范围

1 ≤ n ≤ 100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

题解思路(平欢)

整体快排思路

快速排序: 1、确定分界点 2、调整区间 3、递归处理左右两个区间

1、确定分解点 q[ l ], q[ l + r >> 1 ], q[ r ], 以及随机值;
2、调整区间,也即是 划分为两个区间, 左右半边, 保证左半边的最大值小于等于右半边的最小值;左区间 小于等于 x; 右区间 大于等于 x;

第一种简单划分方法:定义两个数组,a,b;遍历q中元素,将小于等于x的值放入a中,大于x的放入b中,最后再将a,b分别插入q中;

第二种优美划分的方法:可以不用开辟额外的空间,用两个指针,分别为i,j;i从左端开始,向右端扫描,当i指向的值小于x则继续向右端遍历,直到i所指向的值大于x时停止;接着j从右端向左端扫描,当j所指向的值大于x则继续向左端遍历,直至j指向的值小于x时,指针j停止;此时i,j指针都已停止遍历,判断一下i,j是否相遇,如果不相遇则将指针i,j指向的值交换,并继续从指针i的下一个位置开始扫描,如果相遇则划分结束。

3、递归处理左右两段;

细节部分

头文件iostream已包括scanf和printf 最新版本已支持,不支持的可以自己加一个cstdio头文件
左右区间 分别保证 左<= x 和 右>= x;
指针遍历循环判断的时候 不能加等号,例如左边的值小于x, 指针才能指向下一个


C++ 代码
#include <iostream>

using namespace std;

const int N = 1e6 + 10;

void quick_sort (int q[], int l, int r)
{
    if (l >= r) return;
    
    int x = q[l + r >> 1], 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()
{
    int n;
    int q[N];
    
    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]);
    puts("");
    
    return 0;
}
C 代码
#include <stdio.h>

int N = 1e6 + 10;

void quick_sort (int q[], int l, int r)
{
    if (l >= r) return;

    int x = q[l + r >> 1], i = l - 1, j = r + 1; // l+r>>1 => (l+r)/2
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) 
        {
            int t =q[i];
            q[i] = q[j];
            q[j] = t;
        }
    }

    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}

int main()
{
    int n;
    int q[N];

    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]);
    puts("");

    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言中的快速排序算法代码: ```c void swap(int *arr, int i, int j) { int temp = arr[i]; arr[i = arr[j]; arr[j = temp; } int quick(int *arr, int leftbound, int rightbound) { int leftptr = leftbound + 1; int rightptr = rightbound; int pivot = arr[leftbound]; while (leftptr <= rightptr) { while (leftptr <= rightptr && arr[leftptr < pivot) { leftptr++; } while (leftptr <= rightptr && arr[rightptr >= pivot) { rightptr--; } if (leftptr < rightptr) { swap(arr, leftptr, rightptr); } } swap(arr, leftbound, rightptr); return rightptr; } void quick_sort(int *arr, int left, int right) { if (right <= left) { return; } int mid = quick(arr, left, right); quick_sort(arr, left, mid-1); quick_sort(arr, mid+1, right); } ``` 以上代码实现了C语言中的快速排序算法快速排序算法的基本思想是通过选取一个基准值,将数组分为两个子数组,然后对子数组进递归排序操作。排序过程中会不断地交换元素位置,使得基准值左侧的元素小于等于基准值,右侧的元素大于等于基准值。最终,整个数组将被排序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++实现快速排序,最简单的代码(详细解读)](https://blog.csdn.net/nbu_dahe/article/details/119008668)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值