C/C++ 快速排序

个人主页:仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客

专题分栏:算法_仍有未知等待探索的博客-CSDN博客

快速排序的思想------分治

目录

一、引言

二、讲解

1、步骤

2、代码

1.以左边界作为基准

2.以右边界作为基准

3.以中心点作为基准


一、引言

快速排序是对冒泡排序的一种改进。它的基本思想在于划分,首先选一个基准x,让x的左边都小于x,让x的右边都大于x。然后通过递归,一直将数组分成两个或一个元素。

二、讲解

1、步骤

1、将确定分界点。

2、调整范围------让基准x的左边都小于x,让x的右边都大于x。

3、递归分治。

注意:边界问题

如果arr数组为:【0,1】

基准点为左边界。

x=0,i=-1,j=2;

因为i先自增,arr0==0,退出循环.。

j先自减,arrj>0,继续进入循环,j--,arrj==0,退出循环。

如果:

quick(arr,l,i-1);

quick(arr,i,r);

这样分治的话:第一个递归进入后会立刻退出来,因为分治的区间没有元素。第二个递归进入后,要进行划分的区间仍然是【0,1】,将会死循环,栈溢出。

所以分边界点的话要用j进行区分。

2、代码

1.以左边界作为基准

cpp 复制代码
#include<iostream>
using namespace std;
#include<cstdio>
const int N = 1e5 + 5;
int arr[N], n;
void quick_sort(int arr[], int l, int r) {
    if (l >= r) {
        return;
    }
    //基准x是arr数组的左边界
    int i = l - 1, j = r + 1, x = arr[l];
    while (i < j) {
        do {
            i++;
        } while (arr[i] < x);
        do {
            j--;
        } while (arr[j] > x);
        if (i < j) {
            int temp;
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    //这块要配合着基准x为arr的左边界,下边的j不能换成i
    //如果要换成i的话,基准x也要跟着变
    quick_sort(arr, l, j);
    quick_sort(arr, j + 1, r);
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    quick_sort(arr, 0, n - 1);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

2.以右边界作为基准

cpp 复制代码
#include<iostream>
using namespace std;
#include<cstdio>
const int N = 1e5 + 5;
int arr[N], n;
void quick_sort(int arr[], int l, int r) {
    if (l >= r) {
        return;
    }
    int i = l - 1, j = r + 1, x = arr[r];
    while (i < j) {
        do {
            i++;
        } while (arr[i] < x);
        do {
            j--;
        } while (arr[j] > x);
        if (i < j) {
            int temp;
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    quick_sort(arr, l, i-1);
    quick_sort(arr, i, r);
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    quick_sort(arr, 0, n - 1);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

3.以中心点作为基准

cpp 复制代码
#include<iostream>
using namespace std;
#include<cstdio>
const int N = 1e5 + 5;
int arr[N], n;
void quick_sort(int arr[], int l, int r) {
    if (l >= r) {
        return;
    }
    int i = l - 1, j = r + 1, x = arr[(l+r)/2];
    while (i < j) {
        do {
            i++;
        } while (arr[i] < x);
        do {
            j--;
        } while (arr[j] > x);
        if (i < j) {
            int temp;
            temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    quick_sort(arr, l, j);
    quick_sort(arr, j+1, r);
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    quick_sort(arr, 0, n - 1);
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}
相关推荐
David猪大卫5 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger5 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
vvilkim7 小时前
数据结构类型、区别与应用场景:一篇讲透选型逻辑
数据结构
努力努力再努力wz8 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化8 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu9 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu10 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖10 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
阿卡好可爱11 小时前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
沫璃染墨11 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp