0
点赞
收藏
分享

微信扫一扫

ChatGPT 问世一周年之际,开源大模型能否迎头赶上?

冶炼厂小练 2023-12-04 阅读 43

快速排序的思想——分治

目录

一、引言

二、讲解

1、步骤

2、代码

1.以左边界作为基准

2.以右边界作为基准

3.以中心点作为基准 


一、引言

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

二、讲解

1、步骤

注意:边界问题

2、代码

1.以左边界作为基准

#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.以右边界作为基准

#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.以中心点作为基准 

#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;
}

举报

相关推荐

0 条评论